/ Hex Artifact Content
Login

Artifact 943bb821042c8775672f2d0021d963b7243e53a9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
05a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
05b0: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
05c0: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
05d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
05e0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
05f0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0600: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0610: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0620: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0630: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0650: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0660: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
0670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
0680: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
0690: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
06a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
06b0: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
06c0: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
06d0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
06e0: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
06f0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
0700: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
0710: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
0720: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
0730: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
0740: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
0750: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
0760: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
0770: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
0780: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
0790: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
07a0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
07b0: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
07c0: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
07d0: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
07e0: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  results..**.** I
07f0: 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  f the ONEPASS op
0800: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
0810: 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74  ed (if this rout
0820: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
0830: 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77  ).** then also w
0840: 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73  rite the indices
0850: 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   of open cursors
0860: 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53   used by ONEPASS
0870: 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30  .** into aiCur[0
0880: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20  ] and aiCur[1]. 
0890: 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74   iaCur[0] gets t
08a0: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
08b0: 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61   data.** table a
08c0: 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73  nd iaCur[1] gets
08d0: 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
08e0: 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79   by an auxiliary
08f0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65   index..** Eithe
0900: 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d  r value may be -
0910: 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
0920: 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  at cursor is not
0930: 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75   used..** Any cu
0940: 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77  rsors returned w
0950: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ill have been op
0960: 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
0970: 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d  ..**.** aiCur[0]
0980: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f   and aiCur[1] bo
0990: 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65  th get -1 if the
09a0: 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f   where-clause lo
09b0: 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65  gic is.** unable
09c0: 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50   to use the ONEP
09d0: 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
09e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
09f0: 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57  WhereOkOnePass(W
0a00: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
0a10: 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20  , int *aiCur){. 
0a20: 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70   memcpy(aiCur, p
0a30: 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
0a40: 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  ass, sizeof(int)
0a50: 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  *2);.  return pW
0a60: 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b  Info->okOnePass;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0a80: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0a90: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ab0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ac0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ad0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0ae0: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0af0: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0b00: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0b10: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0b20: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0b40: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0b50: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0b60: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0b70: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0b80: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0b90: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0ba0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0bb0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0bc0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0bd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
0be0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
0bf0: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
0c00: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
0c10: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
0c20: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
0c30: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
0c40: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
0c50: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
0c60: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
0c70: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
0c80: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
0c90: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
0ca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0cb0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
0cc0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
0cd0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0ce0: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
0d00: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
0d10: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
0d20: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
0d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0d40: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
0d50: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
0d60: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
0d70: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
0d80: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
0d90: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
0da0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
0db0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
0dc0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
0dd0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
0de0: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
0df0: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
0e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
0e10: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
0e20: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
0e30: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
0e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0e60: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
0e70: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
0e80: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
0e90: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
0ea0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
0eb0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
0ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
0ed0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
0ee0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
0ef0: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
0f00: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
0f10: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
0f20: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
0f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0f40: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
0f50: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
0f60: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
0f70: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
0f80: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
0f90: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
0fa0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
0fb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
0fc0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
0fd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0fe0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
0ff0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1000: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
1010: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1020: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
1030: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
1040: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
1050: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20  eInfo *pWInfo   
1060: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1070: 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  E processing con
1080: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  text */.){.  pWC
1090: 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  ->pWInfo = pWInf
10a0: 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  o;.  pWC->pOuter
10b0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
10c0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
10d0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
10e0: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
10f0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
1100: 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46  aStatic;.}../* F
1110: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1120: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1130: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1140: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
1150: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1160: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
1170: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
1180: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
1190: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11a0: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
11b0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
11c0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
11d0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
11e0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
11f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
1210: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
1220: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1230: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
1240: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
1250: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1260: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
1270: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1280: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
1290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
12a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
12b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
12c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
12d0: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
12e0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
12f0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
1300: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
1310: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
1320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1330: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
1340: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1360: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
1370: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
1380: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
1390: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
13a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
13c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
13d0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61  =pWC->nTerm-1, a
13e0: 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  =pWC->a; i>=0; i
13f0: 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66  --, a++){.    if
1400: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
1410: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1420: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1430: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45  Delete(db, a->pE
1440: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
1450: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
1460: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a   TERM_ORINFO ){.
1470: 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66        whereOrInf
1480: 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75  oDelete(db, a->u
1490: 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  .pOrInfo);.    }
14a0: 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c  else if( a->wtFl
14b0: 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e  ags & TERM_ANDIN
14c0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
14d0: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64  eAndInfoDelete(d
14e0: 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  b, a->u.pAndInfo
14f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1500: 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e  f( pWC->a!=pWC->
1510: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73  aStatic ){.    s
1520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1530: 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a   pWC->a);.  }.}.
1540: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
1550: 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  gle new WhereTer
1560: 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57  m entry to the W
1570: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
1580: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65  t pWC..** The ne
1590: 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  w WhereTerm obje
15a0: 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65  ct is constructe
15b0: 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e  d from Expr p an
15c0: 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a  d with wtFlags..
15d0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20  ** The index in 
15e0: 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  pWC->a[] of the 
15f0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73  new WhereTerm is
1600: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1610: 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65  cess..** 0 is re
1620: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65  turned if the ne
1630: 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c  w WhereTerm coul
1640: 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64  d not be added d
1650: 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a  ue to a memory.*
1660: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  * allocation err
1670: 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  or.  The memory 
1680: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1690: 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  re will be recor
16a0: 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62  ded in.** the db
16b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
16c0: 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68  lag so that high
16d0: 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f  er-level functio
16e0: 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74  ns can detect it
16f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1700: 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  tine will increa
1710: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1720: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
1730: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
1740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46  **.** If the wtF
1750: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
1760: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
1770: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
1780: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
1790: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
17a0: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
17b0: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
17c0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
17d0: 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72  C..** This is tr
17e0: 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  ue even if this 
17f0: 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f  routine fails to
1800: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1810: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
1820: 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20   WARNING:  This 
1830: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1840: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61  allocate the spa
1850: 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ce used to store
1860: 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20  .** WhereTerms. 
1870: 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   All pointers to
1880: 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75   WhereTerms shou
1890: 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ld be invalidate
18a0: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
18b0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
18c0: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
18d0: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
18e0: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
18f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
1900: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
1910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
1920: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
1930: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
1940: 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73  r *p, u8 wtFlags
1950: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1960: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1970: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
1980: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1990: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
19e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
19f0: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a00: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a30: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a40: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a50: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a60: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ad0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1ae0: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1af0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b00: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b10: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b20: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b40: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b50: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b70: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1b80: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1b90: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
1ba0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
1bb0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
1bc0: 20 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61   if( p && ExprHa
1bd0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1be0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
1bf0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
1c00: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  b = sqlite3LogEs
1c10: 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39  t(p->iTable) - 9
1c20: 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  9;.  }else{.    
1c30: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c40: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65   = -1;.  }.  pTe
1c50: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
1c60: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c70: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
1c80: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
1c90: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
1ca0: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
1cb0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
1cc0: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
1cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
1cf0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
1d20: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
1d30: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
1d40: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
1d50: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
1d60: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
1d70: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
1d80: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
1d90: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1da0: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
1db0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
1dc0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1de0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1df0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1e00: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1e10: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1e20: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1e30: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1e40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e50: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1e70: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
1e80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1e90: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
1ea0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
1eb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1ec0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
1ed0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1ee0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1ef0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1f00: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
1f10: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
1f20: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
1f30: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
1f40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
1f50: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
1f60: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
1f70: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
1f80: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
1f90: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
1fa0: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
1fb0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
1fc0: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
1fd0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1fe0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
1ff0: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
2000: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
2010: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
2020: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
2030: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
2040: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
2050: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
2060: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
2070: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
2080: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
2090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
20a0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
20b0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
20c0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
20d0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
20e0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
20f0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2100: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
2110: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
2120: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
2130: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
2140: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
2150: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
2160: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
2170: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
2180: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
2190: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
21a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
21b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
21c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
21d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
21e0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
21f0: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
2200: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
2210: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
2220: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
2230: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
2240: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
2250: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
2260: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
2270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2280: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2290: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
22a0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
22b0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
22c0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
22d0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
22e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
22f0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
2300: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2310: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2320: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
2330: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
2340: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2350: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
2360: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2370: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
2380: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
2390: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
23a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
23b0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
23c0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
23d0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
23e0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
23f0: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2400: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2410: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2420: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2430: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2440: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2450: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
2460: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
2470: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
2480: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
2490: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
24a0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
24b0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
24c0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
24d0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
24e0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
24f0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2500: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
2510: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2520: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2530: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2540: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
2550: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2560: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
2570: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2580: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2590: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
25a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
25b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
25c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
25d0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
25e0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2600: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2610: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2620: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2630: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2640: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2650: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2660: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
2670: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2680: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2690: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
26a0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
26b0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
26d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
26e0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
26f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2700: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
2710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2720: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2730: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2740: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2750: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2760: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2770: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2780: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2790: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
27b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
27c0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
27d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
27e0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
27f0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2810: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2820: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2830: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2840: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2850: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
2860: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
2870: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
2880: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2890: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
28a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
28b0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
28c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
28d0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
28e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
28f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2900: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
2910: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2920: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2930: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
2940: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2950: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2960: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
2970: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
2980: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2990: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
29a0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
29b0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
29c0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
29d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29e0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
29f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
2a00: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
2a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2a20: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
2a30: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
2a40: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2a50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a60: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
2a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a80: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
2a90: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
2aa0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
2ab0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ac0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
2ad0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
2ae0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
2af0: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
2b00: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
2b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2b20: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
2b30: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
2b40: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
2b50: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
2b60: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
2b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2b80: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
2b90: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
2ba0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
2bb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2bc0: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
2bd0: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
2be0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
2bf0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
2c00: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2c10: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
2c20: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
2c30: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
2c40: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
2c50: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
2c60: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
2c70: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
2c80: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
2c90: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
2ca0: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
2cb0: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
2cc0: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
2cd0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2ce0: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
2cf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
2d00: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
2d10: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
2d20: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
2d30: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
2d40: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
2d50: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
2d60: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
2d70: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
2d80: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
2d90: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
2da0: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
2db0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
2dc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2dd0: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
2de0: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
2df0: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
2e00: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
2e10: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
2e20: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
2e30: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
2e40: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
2e50: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
2e60: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
2e70: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
2e80: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
2e90: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
2ea0: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
2eb0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
2ec0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
2ed0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
2ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ef0: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
2f00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2f10: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
2f20: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
2f30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2f40: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
2f50: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
2f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
2f70: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
2f80: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
2f90: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
2fa0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
2fb0: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
2fc0: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
2fd0: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
2fe0: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
2ff0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3000: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
3010: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
3020: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
3030: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
3040: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
3050: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
3060: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
3070: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
3080: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
3090: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
30a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
30b0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
30c0: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
30d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
30e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3100: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
3110: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
3120: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
3130: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
3140: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
3150: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
3160: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3170: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
3180: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
3190: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
31a0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
31b0: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
31c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
31d0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
31e0: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
31f0: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
3200: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
3210: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
3220: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3230: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
3240: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
3250: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
3260: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
3270: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
3280: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
3290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
32a0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
32b0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
32c0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
32d0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
32e0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
32f0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
3300: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
3310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
3320: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
3330: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
3340: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
3350: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
3360: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
3370: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
3380: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
3390: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
33a0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
33b0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
33c0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
33d0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
33e0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
33f0: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
3400: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
3410: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
3420: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
3430: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
3440: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3450: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
3460: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
3470: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
3480: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
34a0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
34b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34c0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
34d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34e0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
34f0: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3500: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3510: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3520: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3530: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3540: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
3550: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
3560: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
3570: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
3580: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
3590: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
35a0: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
35b0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
35d0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
35e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
35f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
3600: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
3610: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
3620: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
3630: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
3640: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
3650: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
3660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
3670: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
3680: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
3690: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
36a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
36b0: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
36c0: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
36d0: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
36e0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
36f0: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
3700: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
3710: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3720: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
3730: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
3740: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
3750: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
3760: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
3770: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
3780: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
3790: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
37a0: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
37b0: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
37c0: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
37d0: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
37e0: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
37f0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
3800: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
3810: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3820: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
3830: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
3840: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
3850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
3860: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
3870: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
3880: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
3890: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
38a0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
38b0: 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  r.         && pT
38c0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
38d0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
38e0: 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69      && (pScan->i
38f0: 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70  Equiv<=2 || !Exp
3900: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
3910: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
3920: 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20  omJoin)).       
3930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3940: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
3950: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
3960: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
3970: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
3980: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
3990: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
39a0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
39b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
39c0: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
39d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
39e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
39f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3a00: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3a10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
3a30: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
3a40: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
3a50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3a60: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
3a70: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
3a80: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
3a90: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
3aa0: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3af0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
3b00: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
3b10: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b20: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
3b30: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
3b40: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
3b50: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
3b60: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
3b70: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
3b80: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
3b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3bb0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
3bc0: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
3bd0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
3be0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
3bf0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
3c00: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
3c10: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3c30: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3c40: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
3c50: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
3c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3c70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3c80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3c90: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
3ca0: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
3cb0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
3cc0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
3cd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
3ce0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
3cf0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
3d00: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
3d10: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
3d20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3d40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3d50: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
3d60: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
3d70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3d80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
3d90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
3de0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
3df0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
3e00: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
3e10: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
3e20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
3e30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3e40: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3e50: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
3e60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
3e70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3e80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
3e90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3eb0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3ec0: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3ee0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ef0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
3f00: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
3f10: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
3f20: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
3f30: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
3f40: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
3f50: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
3f60: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
3f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3f80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fa0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
3fb0: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
3fc0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
3fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
4010: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
4020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
4030: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
4040: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
4050: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
4060: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
4070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4080: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
4090: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
40a0: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
40b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
40c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
40d0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
40e0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
40f0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
4100: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
4110: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
4120: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
4130: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
4140: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
4150: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
4160: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
4170: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
4180: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
4190: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
41a0: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
41b0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
41c0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
41d0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
41e0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
41f0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
4200: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
4210: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
4220: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
4230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
4240: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
4250: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4260: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
4270: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
4280: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
4290: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
42a0: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
42b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
42c0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
42d0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
42e0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
42f0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
4300: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4310: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
4320: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4330: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
4350: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
4360: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
4370: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
4380: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
4390: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
43a0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
43b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
43c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
43d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
43e0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
43f0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
4400: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
4410: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
4420: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4440: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
4450: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4470: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
4480: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
4490: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
44a0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
44b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
44c0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
44d0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
44e0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
44f0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
4500: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
4510: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
4520: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
4530: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
4540: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
4550: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
4560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
4570: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
4580: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
4590: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
45a0: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
45b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
45c0: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b  EVER(j>=pIdx->nK
45d0: 65 79 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20  eyCol) ) return 
45e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
45f0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
4610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
4620: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
4630: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4640: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
4650: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
4660: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
4670: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
4680: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
4690: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
46a0: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
46c0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
46d0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
46e0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
46f0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
4700: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
4710: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
4720: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
4730: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4740: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
4750: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
4760: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
4770: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
4780: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
4790: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
47a0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
47b0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
47c0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
47d0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
47e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
47f0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
4800: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
4810: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
4820: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
4830: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
4840: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
4850: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
4860: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4870: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
4880: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
4890: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
48a0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
48b0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
48c0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
48d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
48e0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
48f0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
4900: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
4910: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
4920: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
4930: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
4940: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
4950: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
4960: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
4970: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
4980: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
4990: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
49a0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
49b0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
49c0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
49d0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
49e0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
49f0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
4a00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
4a10: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
4a20: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
4a30: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
4a40: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
4a50: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
4a60: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
4a70: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
4a80: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
4a90: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
4aa0: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
4ab0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
4ac0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4ad0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
4ae0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
4af0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
4b00: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
4b10: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
4b20: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
4b30: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4b40: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
4b50: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
4b60: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
4b70: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4b80: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
4b90: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
4ba0: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
4bb0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
4bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
4bd0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
4be0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
4bf0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
4c00: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
4c10: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
4c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
4c30: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
4c40: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4c50: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
4c60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4c70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
4c80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
4c90: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
4ca0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4cb0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
4cc0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
4cd0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4ce0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
4cf0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4d00: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4d10: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
4d20: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
4d30: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
4d40: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
4d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4d60: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
4d70: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
4d80: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
4d90: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
4da0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
4db0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
4dc0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
4dd0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
4de0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
4df0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
4e00: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
4e10: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
4e20: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
4e30: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
4e40: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
4e50: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
4e60: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
4e70: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
4e80: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
4e90: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
4ea0: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
4eb0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
4ec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4ed0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
4ee0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
4ef0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
4f00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
4f10: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
4f20: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
4f30: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
4f40: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4f50: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
4f60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
4f70: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
4f80: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
4f90: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
4fa0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
4fb0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
4fc0: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
4fd0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4fe0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
4ff0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5000: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5010: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5020: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5030: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5040: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5050: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5060: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5070: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5080: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5090: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
50a0: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
50b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50c0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
50d0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
50e0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
50f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5100: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5110: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5120: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5130: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5140: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5150: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5160: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5170: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5180: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5190: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
51a0: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
51b0: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
51c0: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
51d0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
51e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
51f0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5210: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5220: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5230: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5240: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5250: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5260: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5270: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5280: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5290: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
52a0: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
52b0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
52c0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
52d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
52e0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
52f0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5300: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5310: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5320: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5330: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5340: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5350: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5360: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5380: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5390: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
53a0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53b0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
53c0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
53d0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
53e0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
53f0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5400: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5410: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5420: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5430: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5440: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
5470: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
5480: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
54a0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
54b0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
54c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
54d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
54e0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
54f0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
5500: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5510: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5540: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5550: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5570: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5580: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5590: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
55a0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
55b0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
55c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
55d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
55e0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
55f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5600: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5610: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5620: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5630: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5640: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5650: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
5660: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5670: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
5680: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
5690: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
56a0: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
56b0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
56c0: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
56d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
56e0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
56f0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
5700: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
5710: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
5720: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
5730: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
5740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
5750: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
5760: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
5770: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
5780: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
5790: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73  */..  pRight = s
57a0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
57b0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30  llate(pList->a[0
57c0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d  ].pExpr);.  op =
57d0: 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69   pRight->op;.  i
57e0: 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  f( op==TK_VARIAB
57f0: 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  LE ){.    Vdbe *
5800: 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61  pReprepare = pPa
5810: 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b  rse->pReprepare;
5820: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
5830: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b  pRight->iColumn;
5840: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
5850: 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
5860: 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c  alue(pReprepare,
5870: 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46   iCol, SQLITE_AF
5880: 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28  F_NONE);.    if(
5890: 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33   pVal && sqlite3
58a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c  _value_type(pVal
58b0: 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
58c0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61  {.      z = (cha
58d0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
58e0: 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20  e_text(pVal);.  
58f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
5900: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
5910: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f  arse->pVdbe, iCo
5920: 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
5930: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56  pRight->op==TK_V
5940: 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68  ARIABLE || pRigh
5950: 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  t->op==TK_REGIST
5960: 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ER );.  }else if
5970: 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ( op==TK_STRING 
5980: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68  ){.    z = pRigh
5990: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d  t->u.zToken;.  }
59a0: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
59b0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
59c0: 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d  le( (c=z[cnt])!=
59d0: 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26  0 && c!=wc[0] &&
59e0: 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d   c!=wc[1] && c!=
59f0: 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63  wc[2] ){.      c
5a00: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
5a10: 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35  if( cnt!=0 && 25
5a20: 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20  5!=(u8)z[cnt-1] 
5a30: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
5a40: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70  Prefix;.      *p
5a50: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d  isComplete = c==
5a60: 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31  wc[0] && z[cnt+1
5a70: 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65  ]==0;.      pPre
5a80: 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  fix = sqlite3Exp
5a90: 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c  r(db, TK_STRING,
5aa0: 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   z);.      if( p
5ab0: 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78  Prefix ) pPrefix
5ac0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20  ->u.zToken[cnt] 
5ad0: 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72  = 0;.      *ppPr
5ae0: 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a  efix = pPrefix;.
5af0: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
5b00: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
5b10: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
5b20: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5b40: 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70  eSetVarmask(v, p
5b50: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  Right->iColumn);
5b60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69  .        if( *pi
5b70: 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69  sComplete && pRi
5b80: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  ght->u.zToken[1]
5b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5ba0: 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74   If the rhs of t
5bb0: 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69  he LIKE expressi
5bc0: 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65  on is a variable
5bd0: 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
5be0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  t.          ** v
5bf0: 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69  alue of the vari
5c00: 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65  able means there
5c10: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69   is no need to i
5c20: 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20  nvoke the LIKE. 
5c30: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
5c40: 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50  tion, then no OP
5c50: 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62  _Variable will b
5c60: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
5c70: 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20  rogram..        
5c80: 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73    ** This causes
5c90: 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68   problems for th
5ca0: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  e sqlite3_bind_p
5cb0: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a  arameter_name().
5cc0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49            ** API
5cd0: 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20  . To workaround 
5ce0: 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d  them, add a dumm
5cf0: 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65  y OP_Variable he
5d00: 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  re..          */
5d10: 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20   .          int 
5d20: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5d30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5d40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5d50: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
5d60: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
5d70: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  r1);.          s
5d80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5d90: 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P3(v, sqlite3Vdb
5da0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
5db0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
5dc0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5dd0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5de0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
5df0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5e00: 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  .      z = 0;.  
5e10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
5e20: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
5e30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d  );.  return (z!=
5e40: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
5e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
5e60: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
5e70: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
5e80: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5e90: 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  BLE./*.** Check 
5ea0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5eb0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
5ec0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
5ed0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
5ee0: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
5ef0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
5f00: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
5f10: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
5f20: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
5f30: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
5f40: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
5f50: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
5f60: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
5f70: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
5f80: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
5f90: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
5fa0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
5fb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
5fc0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5fd0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
5fe0: 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a  ,"match")!=0 ){.
5ff0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6000: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
6010: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
6020: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ( pList->nExpr!=
6030: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
6040: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
6050: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e  st->a[1].pExpr->
6060: 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20  op != TK_COLUMN 
6070: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
6090: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
60a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
60b0: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
60c0: 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70  If the pBase exp
60d0: 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
60e0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
60f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a  USING clause of.
6100: 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ** a join, then 
6110: 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70  transfer the app
6120: 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67  ropriate marking
6130: 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65  s over to derive
6140: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6150: 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61  d transferJoinMa
6160: 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65  rkings(Expr *pDe
6170: 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61  rived, Expr *pBa
6180: 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69  se){.  if( pDeri
6190: 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69  ved ){.    pDeri
61a0: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
61b0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
61c0: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44  FromJoin;.    pD
61d0: 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f  erived->iRightJo
61e0: 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d  inTable = pBase-
61f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6200: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
6210: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6220: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
6230: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
6240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6250: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
6260: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
6270: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
6280: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
6290: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
62a0: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
62b0: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
62c0: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
62d0: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
62e0: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
6310: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
6320: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
6330: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
6340: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
6350: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
6360: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
6370: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6380: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
6390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
63a0: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
63b0: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
63c0: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
63d0: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
63e0: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
63f0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
6400: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
6410: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
6420: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
6430: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
6440: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
6450: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
6460: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
6470: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
6480: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
6490: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
64a0: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
64b0: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
64c0: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
64d0: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
64e0: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
64f0: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
6500: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
6510: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
6520: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
6530: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
6540: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
6550: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
6560: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
6570: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
6580: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
6590: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
65a0: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
65b0: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
65c0: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
65d0: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
65e0: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
65f0: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
6600: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
6610: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
6620: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
6630: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
6640: 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  .z=6).**.** CASE
6650: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
6660: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
6670: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
6680: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
6690: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
66a0: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
66b0: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
66c0: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
66d0: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
66e0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
66f0: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
6700: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
6710: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
6720: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
6730: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
6740: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
6750: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
6760: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
6770: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
6780: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
6790: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
67a0: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
67b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
67c0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
67d0: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
67e0: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
67f0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
6800: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
6810: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
6820: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
6830: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
6840: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
6850: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
6860: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
6870: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
6880: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
6890: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
68a0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
68b0: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
68c0: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
68d0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
68e0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
68f0: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
6900: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
6910: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
6920: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
6930: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
6940: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
6950: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
6960: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
6970: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
6980: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
6990: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
69a0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
69b0: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
69c0: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
69d0: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
69e0: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
69f0: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
6a00: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
6a10: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
6a20: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
6a30: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6a40: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
6a50: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
6a60: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
6a70: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
6a80: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
6a90: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
6aa0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
6ab0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
6ac0: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
6ad0: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
6ae0: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
6af0: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
6b00: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
6b10: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
6b20: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
6b30: 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77 68  s decided elsewh
6b40: 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79  ere.  This analy
6b50: 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  sis only looks a
6b60: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
6b70: 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  ms.** appropriat
6b80: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65  e for indexing e
6b90: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  xist..**.** All 
6ba0: 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75  examples A throu
6bb0: 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69 73  gh E above satis
6bc0: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
6bd0: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
6be0: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
6bf0: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
6c00: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
6c10: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
6c20: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
6c30: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
6c40: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
6c50: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
6c60: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
6c70: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
6c80: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
6c90: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
6ca0: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
6cb0: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
6cc0: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
6cd0: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
6ce0: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
6cf0: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
6d00: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
6d10: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
6d20: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
6d30: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
6d40: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
6d50: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
6d60: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
6d70: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
6d80: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
6d90: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
6da0: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
6db0: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
6dc0: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
6dd0: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
6de0: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
6df0: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
6e00: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
6e10: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
6e20: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
6e30: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
6e40: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
6e50: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
6e60: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
6e70: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
6e80: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
6e90: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
6ea0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
6eb0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
6ec0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
6ed0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
6ee0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
6ef0: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
6f00: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
6f10: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
6f20: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
6f30: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
6f40: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
6f50: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
6f60: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
6f70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  ;        /* WHER
6f80: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
6f90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6fa0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
6fb0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6fd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6fe0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6ff0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
7000: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
7010: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7020: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7030: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
7040: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
7050: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
7060: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
7070: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
7080: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
7090: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
70a0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
70b0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  m */.  int i;   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
70e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
70f0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7100: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
7110: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
7120: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
7130: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7140: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
7150: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
7160: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
7170: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
7180: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
7190: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
71a0: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
71b0: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
71c0: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
71d0: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
71e0: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
71f0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
7200: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
7210: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
7220: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
7230: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
7240: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
7250: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
7260: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
7270: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
7280: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
7290: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
72a0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
72b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
72c0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
72d0: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
72e0: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
72f0: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
7300: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
7310: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
7320: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
7330: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
7340: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
7350: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
7360: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
7370: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7380: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
7390: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
73a0: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
73b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
73c0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
73d0: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
73e0: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
73f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
7400: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
7410: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
7420: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
7430: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
7440: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66  nit(pOrWc, pWInf
7450: 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  o);.  whereSplit
7460: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
7470: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
7480: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
7490: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
74a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
74b0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
74c0: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
74d0: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
74e0: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
74f0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
7500: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
7510: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
7520: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
7530: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
7540: 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b  ToIN = ~(Bitmask
7550: 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57  )0;.  for(i=pOrW
7560: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
7570: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
7580: 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b  =0 && indexable;
7590: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
75a0: 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65  {.    if( (pOrTe
75b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
75c0: 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b  WO_SINGLE)==0 ){
75d0: 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49  .      WhereAndI
75e0: 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20  nfo *pAndInfo;. 
75f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
7600: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7610: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
7620: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
7630: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
7640: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
7650: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
7660: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7670: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
7680: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
7690: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
76a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
76b0: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
76c0: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
76d0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
76e0: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
76f0: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
7700: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
7710: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
7720: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
7730: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
7740: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
7750: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
7760: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
7770: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
7780: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
7790: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
77a0: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
77b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20  pWC->pWInfo);.  
77c0: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
77d0: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
77e0: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
77f0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
7800: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
7810: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
7820: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
7830: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
7840: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
7850: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
7860: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
7870: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7880: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
7890: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
78a0: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
78b0: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
78c0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
78d0: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
78e0: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
78f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
7900: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
7910: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
7930: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
7940: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41  fo->sMaskSet, pA
7950: 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ndTerm->leftCurs
7960: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
7970: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
7980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7990: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
79a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
79b0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
79c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
79d0: 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f  OPIED ){.      /
79e0: 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d  * Skip this term
79f0: 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65   for now.  We re
7a00: 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65  visit it when we
7a10: 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20   process the.   
7a20: 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
7a30: 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ing TERM_VIRTUAL
7a40: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c   term */.    }el
7a50: 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
7a60: 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67  k b;.      b = g
7a70: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
7a80: 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  sMaskSet, pOrTer
7a90: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
7aa0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
7ab0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7ac0: 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  M_VIRTUAL ){.   
7ad0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
7ae0: 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d  pOther = &pOrWc-
7af0: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
7b00: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  ent];.        b 
7b10: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
7b20: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
7b30: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
7b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7b50: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
7b60: 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54  .      if( (pOrT
7b70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b80: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20   WO_EQ)==0 ){.  
7b90: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7ba0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
7bb0: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
7bc0: 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  N &= b;.      }.
7bd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
7be0: 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20    ** Record the 
7bf0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7c00: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
7c10: 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68  2.  The set migh
7c20: 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e  t be.  ** empty.
7c30: 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d  .  */.  pOrInfo-
7c40: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64  >indexable = ind
7c50: 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d  exable;.  pTerm-
7c60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64  >eOperator = ind
7c70: 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20  exable==0 ? 0 : 
7c80: 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  WO_OR;..  /*.  *
7c90: 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73  * chngToIN holds
7ca0: 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73   a set of tables
7cb0: 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61   that *might* sa
7cc0: 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42  tisfy case 1.  B
7cd0: 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20  ut.  ** we have 
7ce0: 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74  to do some addit
7cf0: 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74  ional checking t
7d00: 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20  o see if case 1 
7d10: 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73  really.  ** is s
7d20: 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20  atisfied..  **. 
7d30: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c   ** chngToIN wil
7d40: 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c  l hold either 0,
7d50: 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20   1, or 2 bits.  
7d60: 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d  The 0-bit case m
7d70: 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  eans.  ** that t
7d80: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69  here is no possi
7d90: 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66  bility of transf
7da0: 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c  orming the OR cl
7db0: 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a  ause into an.  *
7dc0: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65  * IN operator be
7dd0: 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  cause one or mor
7de0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  e terms in the O
7df0: 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  R clause contain
7e00: 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20  .  ** something 
7e10: 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e  other than == on
7e20: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
7e30: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
7e40: 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63  The 1-bit.  ** c
7e50: 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65  ase means that e
7e60: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
7e70: 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66   OR clause is of
7e80: 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22   the form.  ** "
7e90: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70  table.column=exp
7ea0: 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  r" for some sing
7eb0: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f  le table.  The o
7ec0: 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73  ne bit that is s
7ed0: 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72  et.  ** will cor
7ee0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63  respond to the c
7ef0: 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65  ommon table.  We
7f00: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63   still need to c
7f10: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  heck to make.  *
7f20: 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20  * sure the same 
7f30: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f  column is used o
7f40: 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68  n all terms.  Th
7f50: 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20  e 2-bit case is 
7f60: 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c  when.  ** the al
7f70: 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  l terms are of t
7f80: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e  he form "table1.
7f90: 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f  column=table2.co
7fa0: 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20  lumn".  It.  ** 
7fb0: 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
7fc0: 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20  e to form an IN 
7fd0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69  operator with ei
7fe0: 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75  ther table1.colu
7ff0: 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65  mn.  ** or table
8000: 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  2.column as the 
8010: 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73  LHS if either is
8020: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
8030: 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68   term of.  ** th
8040: 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a  e OR clause..  *
8050: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
8060: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
8070: 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  rm "table.column
8080: 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22  1=table.column2"
8090: 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20   (the.  ** same 
80a0: 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69  table on both si
80b0: 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63  zes of the ==) c
80c0: 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
80d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ed..  */.  if( c
80e0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69  hngToIN ){.    i
80f0: 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  nt okToChngToIN 
8100: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
8110: 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   if the conversi
8120: 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69  on to IN is vali
8130: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  d */.    int iCo
8140: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20  lumn = -1;      
8150: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64     /* Column ind
8160: 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20  ex on lhs of IN 
8170: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8180: 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31  int iCursor = -1
8190: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
81a0: 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e  le cursor common
81b0: 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f   to all terms */
81c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20  .    int j = 0; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
81e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
81f0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  /..    /* Search
8200: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64   for a table and
8210: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70   column that app
8220: 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65  ears on one side
8230: 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
8240: 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f  ther of the == o
8250: 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79  perator in every
8260: 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20   subterm.  That 
8270: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8280: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
8290: 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72  recorded in iCur
82a0: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
82b0: 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f    There might no
82c0: 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20  t be any.    ** 
82d0: 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63  such table and c
82e0: 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f  olumn.  Set okTo
82f0: 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61  ChngToIN if an a
8300: 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65  ppropriate table
8310: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75  .    ** and colu
8320: 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  mn is found but 
8330: 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f  leave okToChngTo
8340: 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  IN false if not 
8350: 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  found..    */.  
8360: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26    for(j=0; j<2 &
8370: 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  & !okToChngToIN;
8380: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72   j++){.      pOr
8390: 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b  Term = pOrWc->a;
83a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72  .      for(i=pOr
83b0: 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  Wc->nTerm-1; i>=
83c0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
83d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
83e0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
83f0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
8400: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8410: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54  m->wtFlags &= ~T
8420: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
8430: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8440: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
8450: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8460: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
8470: 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77  2-bit case and w
8480: 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63  e are on the sec
8490: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e  ond iteration an
84a0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
84b0: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66  urrent term is f
84c0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74  rom the first it
84d0: 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69  eration.  So ski
84e0: 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a  p this term. */.
84f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8500: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
8510: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8530: 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20  if( (chngToIN & 
8540: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
8550: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
8560: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
8570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8580: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75   /* This term mu
8590: 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
85a0: 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65  m t1.a==t2.b whe
85b0: 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a  re t2 is in the.
85c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e            ** chn
85d0: 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31  gToIN set but t1
85e0: 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74   is not.  This t
85f0: 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68  erm will be eith
8600: 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20  er preceeded.   
8610: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c         ** or fol
8620: 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72  lwed by an inver
8630: 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d  ted copy (t2.b==
8640: 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69  t1.a).  Skip thi
8650: 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20  s term .        
8660: 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73    ** and use its
8670: 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20   inversion. */. 
8680: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
8690: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
86a0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
86b0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  D );.          t
86c0: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
86d0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
86e0: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
86f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8700: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8710: 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45   (TERM_COPIED|TE
8720: 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20  RM_VIRTUAL) );. 
8730: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8740: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
8750: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
8760: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
8770: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43  lumn;.        iC
8780: 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d  ursor = pOrTerm-
8790: 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  >leftCursor;.   
87a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
87b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
87c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
87d0: 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62  No candidate tab
87e0: 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f  le+column was fo
87f0: 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  und.  This can o
8800: 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  nly occur.      
8810: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f    ** on the seco
8820: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  nd iteration */.
8830: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8840: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8850: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
8860: 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29  fTwo(chngToIN) )
8870: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8880: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
8890: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
88a0: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
88b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
88c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
88d0: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
88e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
88f0: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
8900: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
8910: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
8920: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
8930: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
8940: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
8950: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
8960: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
8970: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
8980: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
8990: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
89a0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
89b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
89c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
89d0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
89e0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
89f0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
8a00: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
8a10: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
8a20: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
8a30: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
8a40: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
8a50: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75  e if( pOrTerm->u
8a60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f  .leftColumn!=iCo
8a70: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
8a80: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
8a90: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
8aa0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
8ab0: 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67   affLeft, affRig
8ac0: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ht;.          /*
8ad0: 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61   If the right-ha
8ae0: 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20  nd side is also 
8af0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74  a column, then t
8b00: 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20  he affinities.  
8b10: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f          ** of bo
8b20: 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66  th right and lef
8b30: 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20  t sides must be 
8b40: 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70  such that no typ
8b50: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
8b60: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72  onversions are r
8b70: 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72  equired on the r
8b80: 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23  ight.  (Ticket #
8b90: 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20  2249).          
8ba0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  */.          aff
8bb0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
8bc0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
8bd0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8be0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ht);.          a
8bf0: 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  ffLeft = sqlite3
8c00: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
8c10: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
8c20: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ft);.          i
8c30: 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26  f( affRight!=0 &
8c40: 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c  & affRight!=affL
8c50: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
8c60: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
8c70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
8c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8c90: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8ca0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b  gs |= TERM_OR_OK
8cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
8ce0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54   this point, okT
8cf0: 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75  oChngToIN is tru
8d00: 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54  e if original pT
8d10: 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20  erm satisfies.  
8d20: 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e    ** case 1.  In
8d30: 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73   that case, cons
8d40: 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74  truct a new virt
8d50: 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73  ual term that is
8d60: 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63   .    ** pTerm c
8d70: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
8d80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
8d90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54    */.    if( okT
8da0: 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20  oChngToIN ){.   
8db0: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20     Expr *pDup;  
8dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
8dd0: 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61  ransient duplica
8de0: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  te expression */
8df0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8e00: 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a  *pList = 0;   /*
8e10: 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   The RHS of the 
8e20: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
8e30: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
8e40: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
8e50: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
8e60: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e70: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20     Expr *pNew;  
8e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8e90: 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65   complete IN ope
8ea0: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  rator */..      
8eb0: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8ec0: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
8ed0: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  rWc->a; i>=0; i-
8ee0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8ef0: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
8f00: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8f10: 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20  ERM_OR_OK)==0 ) 
8f20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8f30: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8f40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8f50: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
8f60: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f70: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
8f80: 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
8f90: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8fa0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
8fb0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
8fc0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
8fd0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54  ExprDup(db, pOrT
8fe0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8ff0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
9000: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
9010: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
9020: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c  Info->pParse, pL
9030: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
9040: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
9050: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9060: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
9070: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
9080: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
9090: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
90a0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
90b0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
90c0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
90d0: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
90e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
90f0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
9100: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
9110: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
9120: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
9130: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
9140: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
9160: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
9170: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
9180: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
9190: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
91a0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
91b0: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
91c0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
91d0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
91e0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
91f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
9200: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
9210: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
9220: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
9230: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9240: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
9250: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
9260: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
9270: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
9280: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
9290: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
92a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
92b0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
92c0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
92d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
92e0: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
92f0: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
9300: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
9310: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9320: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
9330: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
9340: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
9350: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
9360: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
9370: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
9380: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
9390: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
93a0: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
93b0: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
93c0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
93d0: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
93e0: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
93f0: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
9400: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
9410: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
9420: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
9430: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
9440: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
9450: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
9460: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
9470: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
9480: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
9490: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
94a0: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
94b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
94c0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
94d0: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
94e0: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
94f0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
9500: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
9510: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
9520: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
9530: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
9540: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
9550: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
9560: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
9570: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
9580: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
9590: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
95a0: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
95b0: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
95c0: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
95d0: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
95e0: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
95f0: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
9600: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
9610: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
9620: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
9630: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
9640: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
9650: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
9660: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
9670: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
9680: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
9690: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
96a0: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
96b0: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
96c0: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
96d0: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
96e0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
96f0: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
9700: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
9710: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
9720: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
9730: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
9740: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
9750: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
9760: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
9770: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9780: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
9790: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
97a0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
97b0: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
97c0: 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  ; /* WHERE claus
97d0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  e processing con
97e0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
97f0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
9800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9810: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
9820: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
9830: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
9840: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
9850: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
9860: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
9870: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9890: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
98a0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
98b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
98c0: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
98d0: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
98e0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
98f0: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
9900: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
9910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9920: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
9930: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
9940: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
9950: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
9960: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
9970: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
9980: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
9990: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
99a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
99b0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
99c0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
99d0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
99f0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
9a00: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
9a10: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
9a20: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
9a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
9a40: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
9a50: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
9a60: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a80: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
9a90: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
9aa0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
9ab0: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
9ac0: 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e  arse;  /* Parsin
9ad0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
9ae0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9af0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
9b00: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9b10: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
9b20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9b30: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
9b40: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
9b50: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9b60: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
9b70: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
9b80: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
9b90: 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
9ba0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
9bb0: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
9bc0: 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  !=TK_COLLATE );.
9bd0: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
9be0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9bf0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
9c00: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
9c10: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
9c20: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
9c30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
9c40: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9c50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
9c60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
9c70: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
9c80: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9c90: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63  ight = exprSelec
9ca0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
9cb0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
9cc0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
9cd0: 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  se{.      pTerm-
9ce0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9cf0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
9d00: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9d10: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
9d20: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f   }.  }else if( o
9d30: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
9d40: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9d50: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
9d60: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
9d70: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
9d80: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
9d90: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
9da0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
9db0: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
9dc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9dd0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
9de0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9df0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
9e00: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
9e10: 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk x = getMask(p
9e20: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9e30: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
9e40: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
9e50: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
9e60: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
9e70: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
9e80: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
9e90: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20  with an index.  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
9ec0: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
9ed0: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
9ee0: 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65  015 */.  }.  pTe
9ef0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
9f00: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
9f10: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
9f20: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
9f30: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
9f40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9f50: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
9f60: 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45  dOp(op) ){.    E
9f70: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
9f80: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
9f90: 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ate(pExpr->pLeft
9fa0: 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  );.    Expr *pRi
9fb0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
9fc0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
9fd0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9fe0: 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70   u16 opMask = (p
9ff0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a000: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
a010: 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f  =0 ? WO_ALL : WO
a020: 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20  _EQUIV;.    if( 
a030: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
a040: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
a050: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
a060: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
a070: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e  .      pTerm->u.
a080: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
a090: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
a0a0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
a0b0: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
a0c0: 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  sk(op) & opMask;
a0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a0e0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
a0f0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
a100: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
a110: 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  m *pNew;.      E
a120: 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  xpr *pDup;.     
a130: 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20   u16 eExtraOp = 
a140: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  0;        /* Ext
a150: 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77  ra bits for pNew
a160: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
a170: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
a180: 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b  leftCursor>=0 ){
a190: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
a1a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75  New;.        pDu
a1b0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a1c0: 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
a1d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
a1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a200: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a210: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
a220: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
a230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
a240: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
a250: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
a260: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
a270: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
a280: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
a290: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
a2a0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
a2b0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
a2c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
a2d0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
a2e0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
a2f0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
a300: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
a310: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
a320: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
a330: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
a340: 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
a350: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
a360: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
a370: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a380: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
a390: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  ).         && Op
a3a0: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
a3b0: 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61  d(db, SQLITE_Tra
a3c0: 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20 20  nsitive).       
a3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
a3e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  erm->eOperator |
a3f0: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
a400: 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d        eExtraOp =
a410: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
a420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a430: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
a440: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
a450: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
a460: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
a470: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
a480: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
a490: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
a4a0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70  SkipCollate(pDup
a4b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
a4c0: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
a4d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
a4e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
a4f0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
a500: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
a510: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72     testcase( (pr
a520: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
a530: 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71  Right) != prereq
a540: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Left );.      pN
a550: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
a560: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65  = prereqLeft | e
a570: 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20  xtraRight;.     
a580: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
a590: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
a5a0: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
a5b0: 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d  tor = (operatorM
a5c0: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20  ask(pDup->op) + 
a5d0: 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61  eExtraOp) & opMa
a5e0: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  sk;.    }.  }..#
a5f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a600: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
a610: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
a620: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
a630: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
a640: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
a650: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
a660: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
a670: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
a680: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
a690: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
a6a0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
a6b0: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
a6c0: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
a6d0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
a6e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6f0: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
a700: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
a710: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
a720: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
a730: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
a740: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
a750: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
a760: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
a770: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
a780: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
a790: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
a7a0: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
a7b0: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
a7c0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
a7d0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
a7e0: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
a7f0: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
a800: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
a810: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
a820: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
a830: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
a840: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
a850: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
a860: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
a870: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
a880: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
a890: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
a8a0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
a8b0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
a8c0: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
a8d0: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
a8e0: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
a8f0: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
a900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
a910: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
a920: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
a930: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
a940: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
a950: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
a960: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
a970: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
a980: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
a990: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
a9a0: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
a9d0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
a9e0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
aa10: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
aa20: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
aa30: 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72  ;.      transfer
aa40: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
aa50: 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  wExpr, pExpr);. 
aa60: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
aa70: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
aa80: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
aa90: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
aaa0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
aab0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
aac0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  w==0 );.      ex
aad0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
aae0: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
aaf0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
ab00: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
ab10: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
ab20: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
ab30: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
ab40: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ab50: 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  2;.  }.#endif /*
ab60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
ab70: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
ab80: 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  N */..#if !defin
ab90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
aba0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
abb0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
abc0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
abd0: 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ).  /* Analyze a
abe0: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f   term that is co
abf0: 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72  mposed of two or
ac00: 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63   more subterms c
ac10: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a  onnected by.  **
ac20: 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e   an OR operator.
ac30: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
ac40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
ac50: 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
ac60: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ac70: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
ac80: 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20  yzeOrTerm(pSrc, 
ac90: 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  pWC, idxTerm);. 
aca0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
acb0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d  >a[idxTerm];.  }
acc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
acd0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ace0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
acf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
ad00: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
ad10: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
ad20: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
ad30: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
ad40: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
ad50: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
ad60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69  ..  **.  ** A li
ad70: 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68  ke pattern of th
ad80: 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27  e form "x LIKE '
ad90: 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65  abc%'" is change
ada0: 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e  d into constrain
adb0: 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ts.  **.  **    
adc0: 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41        x>='abc' A
add0: 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78  ND x<'abd' AND x
ade0: 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a   LIKE 'abc%'.  *
adf0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
ae00: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ae10: 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73   prefix "abc" is
ae20: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20   incremented to 
ae30: 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65  form the.  ** te
ae40: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
ae50: 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a  ion "abd"..  */.
ae60: 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54    if( pWC->op==T
ae70: 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c  K_AND .   && isL
ae80: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
ae90: 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c  , pExpr, &pStr1,
aea0: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
aeb0: 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20  oCase).  ){.    
aec0: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
aed0: 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b     /* LHS of LIK
aee0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
aef0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  */.    Expr *pSt
af00: 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  r2;       /* Cop
af10: 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53  y of pStr1 - RHS
af20: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
af30: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
af40: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20  pr *pNewExpr1;. 
af50: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
af60: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
af70: 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  ew1;.    int idx
af80: 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  New2;.    Token 
af90: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f  sCollSeqName;  /
afa0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  * Name of collat
afb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
afc0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
afd0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
afe0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
aff0: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b000: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
b010: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
b020: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b030: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
b040: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
b050: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
b060: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
b070: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
b080: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
b090: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
b0a0: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
b0b0: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
b0c0: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
b0d0: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
b0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
b0f0: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
b100: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
b110: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b120: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
b130: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
b140: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
b150: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
b160: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
b170: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
b180: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
b190: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
b1a0: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
b1b0: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
b1c0: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
b1d0: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
b1e0: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
b1f0: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
b200: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
b210: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
b220: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
b230: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
b240: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
b250: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
b260: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
b270: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
b280: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
b290: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
b2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
b2b0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
b2c0: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
b2d0: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
b2e0: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
b2f0: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
b300: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
b310: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
b320: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b330: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
b340: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b350: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b360: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
b370: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b380: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b390: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
b3a0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b3b0: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
b3c0: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b3d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b3e0: 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a  wExpr1, pExpr);.
b3f0: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
b400: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b410: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
b420: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b430: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b440: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b450: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
b460: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b470: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
b480: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
b490: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b4a0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
b4b0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b4d0: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
b4e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b4f0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b500: 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73  rse,pNewExpr2,&s
b510: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b520: 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20           pStr2, 
b530: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b540: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b550: 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a  wExpr2, pExpr);.
b560: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
b570: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b580: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
b590: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b5a0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b5b0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b5c0: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  2==0 );.    expr
b5d0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b5e0: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
b5f0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b600: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
b610: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
b620: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
b630: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
b640: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
b650: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
b660: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
b670: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
b680: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
b690: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
b6b0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b6c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b6d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b6e0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
b6f0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
b700: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
b710: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
b720: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
b730: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
b740: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
b750: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
b760: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
b770: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
b780: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
b790: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
b7a0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
b7b0: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
b7c0: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
b7d0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
b7e0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
b7f0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
b800: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
b810: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
b820: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
b830: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
b840: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
b850: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
b860: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
b870: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
b880: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
b890: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
b8a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b8b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
b8c0: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
b8d0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
b8e0: 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71  Expr;.    prereq
b8f0: 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65  Expr = exprTable
b900: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
b910: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65  pRight);.    pre
b920: 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72  reqColumn = expr
b930: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
b940: 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  Set, pLeft);.   
b950: 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72   if( (prereqExpr
b960: 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29   & prereqColumn)
b970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
b980: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b990: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
b9a0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b9b0: 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20  e, TK_MATCH, .  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
b9e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b9f0: 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29  , pRight, 0), 0)
ba00: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
ba10: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
ba20: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
ba30: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
ba40: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
ba50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
ba60: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
ba70: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
ba80: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
ba90: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
baa0: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
bab0: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
bac0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
bad0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
bae0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
baf0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
bb00: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
bb10: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
bb20: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
bb30: 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e  _MATCH;.      pN
bb40: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
bb50: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
bb60: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
bb70: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
bb80: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
bb90: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
bba0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
bbb0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
bbc0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
bbd0: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
bbe0: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
bbf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bc00: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
bc10: 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
bc20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
bc30: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a  T3_OR_STAT4.  /*
bc40: 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61   When sqlite_sta
bc50: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
bc60: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  a is available a
bc70: 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
bc80: 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49  e.  ** form "x I
bc90: 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20  S NOT NULL" can 
bca0: 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61  sometimes be eva
bcb0: 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69  luated more effi
bcc0: 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20  ciently.  ** as 
bcd0: 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73  "x>NULL" if x is
bce0: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
bcf0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f  PRIMARY KEY.  So
bd00: 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a   construct a.  *
bd10: 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f  * virtual term o
bd20: 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a  f that form..  *
bd30: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
bd40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72   the virtual ter
bd50: 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64  m must be tagged
bd60: 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c   with TERM_VNULL
bd70: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52  .  This.  ** TER
bd80: 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c  M_VNULL tag will
bd90: 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f   suppress the no
bda0: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20  t-null check at 
bdb0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
bdc0: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ** of the loop. 
bdd0: 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52   Without the TER
bde0: 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68  M_VNULL flag, th
bdf0: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
be00: 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61   at.  ** the sta
be10: 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  rt of the loop w
be20: 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20  ill prevent any 
be30: 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69  results from bei
be40: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  ng returned..  *
be50: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
be60: 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
be70: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
be80: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
be90: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
bea0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20  ft->iColumn>=0. 
beb0: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
bec0: 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
bed0: 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a  ITE_Stat3).  ){.
bee0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
bef0: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
bf00: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
bf10: 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
bf20: 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
bf30: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
bf40: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
bf50: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bf60: 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bf90: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
bfa0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
bfc0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bfd0: 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
bfe0: 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
bff0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
c000: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
c010: 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
c040: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
c050: 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
c060: 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
c070: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
c080: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
c090: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
c0a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
c0b0: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
c0c0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
c0d0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
c0e0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c0f0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
c100: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
c110: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
c120: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
c130: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c140: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c150: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c160: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c170: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c180: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c190: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c1a0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c1b0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c1c0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c1d0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c1e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c1f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
c200: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
c210: 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  4 */..  /* Preve
c220: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
c230: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
c240: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
c250: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
c260: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
c270: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
c280: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
c290: 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
c2a0: 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
c2b0: 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ight;.}../*.** T
c2c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
c2d0: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
c2e0: 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  a entry that mat
c2f0: 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
c300: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
c310: 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
c320: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
c330: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
c340: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
c350: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
c360: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
c370: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
c380: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
c390: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c3a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
c3b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
c3e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c3f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
c400: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c410: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
c420: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
c430: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
c440: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
c450: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
c460: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
c470: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
c480: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
c490: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
c4a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
c4b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
c4e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
c4f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
c500: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
c510: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
c520: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
c530: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
c540: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c550: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
c560: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
c570: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
c580: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
c590: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
c5a0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
c5b0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
c5c0: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
c5d0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
c5e0: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
c5f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
c600: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
c610: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
c620: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c630: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
c640: 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71  (pColl) && 0==sq
c650: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
c660: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
c670: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
c680: 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  urn i;.      }. 
c690: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c6a0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
c6b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
c6c0: 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
c6d0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73  ession-list pass
c6e0: 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ed as the third 
c6f0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72  argument.** is r
c700: 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  edundant..**.** 
c710: 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  A DISTINCT list 
c720: 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20  is redundant if 
c730: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
c740: 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65  tains some subse
c750: 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  t of.** columns 
c760: 74 68 61 74 20 61 72 65 20 75 6e 69 71 75 65 20  that are unique 
c770: 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f  and non-null..*/
c780: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69  .static int isDi
c790: 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
c7a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
c7c0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c7d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
c7e0: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  abList,        /
c7f0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
c800: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
c810: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
c820: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
c830: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
c840: 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20  st *pDistinct   
c850: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
c860: 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73  t set that needs
c870: 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20   to be DISTINCT 
c880: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
c890: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
c8a0: 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  dx;.  int i;    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61        .  int iBa
c8d0: 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  se;..  /* If the
c8e0: 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  re is more than 
c8f0: 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  one table or sub
c900: 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46  -select in the F
c910: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20  ROM clause of.  
c920: 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ** this query, t
c930: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  hen it will not 
c940: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73  be possible to s
c950: 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53  how that the DIS
c960: 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75  TINCT .  ** clau
c970: 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  se is redundant.
c980: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
c990: 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  st->nSrc!=1 ) re
c9a0: 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20  turn 0;.  iBase 
c9b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
c9c0: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62  .iCursor;.  pTab
c9d0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
c9e0: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
c9f0: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
ca00: 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50  essions is an IP
ca10: 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c  K column on tabl
ca20: 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65  e iBase, then re
ca30: 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e  turn .  ** true.
ca40: 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69   Note: The (p->i
ca50: 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61  Table==iBase) pa
ca60: 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  rt of this test 
ca70: 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20  may be false if 
ca80: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
ca90: 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72   SELECT is a cor
caa0: 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
cab0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
cac0: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
cad0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
cae0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
caf0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
cb00: 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69  e(pDistinct->a[i
cb10: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
cb20: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
cb30: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
cb40: 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  =iBase && p->iCo
cb50: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
cb60: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  1;.  }..  /* Loo
cb70: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e  p through all in
cb80: 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
cb90: 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63  le, checking eac
cba0: 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d  h to see if it m
cbb0: 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49  akes.  ** the DI
cbc0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
cbd0: 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64   redundant. It d
cbe0: 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a  oes so if:.  **.
cbf0: 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e    **   1. The in
cc00: 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e  dex is itself UN
cc10: 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  IQUE, and.  **. 
cc20: 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20   **   2. All of 
cc30: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
cc40: 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74  he index are eit
cc50: 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  her part of the 
cc60: 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20  pDistinct.  **  
cc70: 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73      list, or els
cc80: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
cc90: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65  se contains a te
cca0: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
ccb0: 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20  col=X",.  **    
ccc0: 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63    where X is a c
ccd0: 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54  onstant value. T
cce0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
ccf0: 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20  uences of the.  
cd00: 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73  **      comparis
cd10: 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69  on and select-li
cd20: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  st expressions m
cd30: 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20  ust match those 
cd40: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
cd50: 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c  **.  **   3. All
cd60: 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20   of those index 
cd70: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
cd80: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
cd90: 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  se does not.  **
cda0: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20        contain a 
cdb0: 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65  "col=X" term are
cdc0: 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f   subject to a NO
cdd0: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
cde0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  t..  */.  for(pI
cdf0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
ce00: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
ce10: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
ce20: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
ce30: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
ce40: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
ce50: 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; i<pIdx->nKeyCo
ce60: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ce70: 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  16 iCol = pIdx->
ce80: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
ce90: 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65     if( 0==findTe
cea0: 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69  rm(pWC, iBase, i
ceb0: 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30  Col, ~(Bitmask)0
cec0: 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29  , WO_EQ, pIdx) )
ced0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49  {.        int iI
cee0: 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65  dxCol = findInde
cef0: 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
cf00: 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70  stinct, iBase, p
cf10: 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Idx, i);.       
cf20: 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c   if( iIdxCol<0 |
cf30: 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  | pTab->aCol[iCo
cf40: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  l].notNull==0 ){
cf50: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
cf60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cf70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
cf80: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( i==pIdx->nKeyC
cf90: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ol ){.      /* T
cfa0: 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65  his index implie
cfb0: 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  s that the DISTI
cfc0: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73  NCT qualifier is
cfd0: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
cfe0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
cff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
d000: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
d010: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67  Estimate the log
d020: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
d030: 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73  put value to bas
d040: 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  e 2..*/.static L
d050: 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67  ogEst estLog(Log
d060: 45 73 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74  Est N){.  LogEst
d070: 20 78 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45   x = sqlite3LogE
d080: 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20  st(N);.  return 
d090: 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20  x>33 ? x - 33 : 
d0a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  0;.}../*.** Two 
d0b0: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
d0c0: 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
d0d0: 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
d0e0: 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
d0f0: 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
d100: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
d110: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
d120: 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
d130: 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
d140: 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
d150: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
d160: 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
d170: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
d180: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d190: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d1a0: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57  LE) && defined(W
d1b0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
d1c0: 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  D).static void T
d1d0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
d1e0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d1f0: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
d200: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
d210: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
d220: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
d230: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
d240: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d250: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d260: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
d270: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
d280: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
d290: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
d2a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2b0: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
d2c0: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
d2d0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
d2e0: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
d2f0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d300: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
d310: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
d320: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
d330: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
d340: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
d350: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d360: 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
d370: 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
d380: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d390: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
d3a0: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
d3b0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
d3c0: 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
d3d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
d3e0: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
d3f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d400: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
d410: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
d420: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
d430: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
d440: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
d450: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d460: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d470: 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
d480: 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
d490: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
d4a0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d4b0: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
d4c0: 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
d4d0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
d4e0: 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
d4f0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d500: 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
d510: 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
d520: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d530: 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
d540: 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
d550: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d560: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
d570: 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
d580: 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
d590: 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
d5a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
d5b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
d5c0: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d5d0: 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cost);.  sqlite3
d5e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
d5f0: 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c  stimatedRows=%ll
d600: 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  d\n", p->estimat
d610: 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  edRows);.}.#else
d620: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
d630: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
d640: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
d650: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
d660: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d670: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
d680: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
d690: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
d6a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
d6b0: 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
d6c0: 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
d6d0: 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
d6e0: 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
d6f0: 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
d700: 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
d710: 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
d720: 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
d730: 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
d740: 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
d750: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
d760: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
d770: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
d780: 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
d790: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
d7a0: 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
d7b0: 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
d7c0: 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
d7d0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d7f0: 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
d800: 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
d810: 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
d820: 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
d830: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
d840: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
d850: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d860: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
d870: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72   & WO_EQ)==0 ) r
d880: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d890: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
d8a0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
d8b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d8c0: 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
d8d0: 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
d8e0: 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
d8f0: 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
d900: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d910: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
d920: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
d930: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
d940: 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
d950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
d960: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
d970: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d980: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
d990: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
d9a0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
d9b0: 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
d9c0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
d9d0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
d9e0: 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
d9f0: 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
da00: 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
da10: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
da20: 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
da30: 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
da40: 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
da50: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
da60: 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
da70: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
da80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
da90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
daa0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
dab0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
dac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
dad0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
dae0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
daf0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
db00: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
db10: 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
db20: 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
db30: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
db40: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
db50: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
db60: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
db70: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
db80: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
db90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dba0: 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
dbb0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b  e */.){.  int nK
dbc0: 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
dbd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dbe0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
dbf0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
dc00: 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
dc10: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
dc20: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
dc30: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
dc40: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
dc50: 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
dc60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
dc70: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
dc80: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dca0: 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
dcb0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
dcc0: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
dcd0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
dcf0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
dd00: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
dd10: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
dd20: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
dd30: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dd40: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
dd50: 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
dd60: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
dd70: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
dd80: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
dd90: 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
dda0: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddc0: 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
ddd0: 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
dde0: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
de00: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
de10: 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
de20: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
de50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
de80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
de90: 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
dea0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
deb0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
dec0: 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
ded0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
dee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
def0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
df00: 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
df10: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
df20: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
df30: 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
df40: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  t */.  char *zNo
df50: 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  tUsed;          
df60: 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
df70: 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  e on the end of 
df80: 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  pIdx */.  Bitmas
df90: 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
dfa0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
dfb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
dfc0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
dfd0: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
dfe0: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
dff0: 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
e000: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
e010: 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e  .  u8 sentWarnin
e020: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
e030: 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e  * True if a warn
e040: 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73  ning has been is
e050: 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  sued */..  /* Ge
e060: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
e070: 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
e080: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
e090: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
e0a0: 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
e0b0: 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
e0c0: 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
e0d0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
e0e0: 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
e0f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
e100: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
e110: 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
e120: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
e130: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
e140: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e150: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
e160: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
e170: 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
e180: 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
e190: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
e1a0: 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f  ints */.  nKeyCo
e1b0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  l = 0;.  pTable 
e1c0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
e1d0: 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
e1e0: 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
e1f0: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
e200: 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
e210: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
e220: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
e230: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
e240: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
e250: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
e260: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
e270: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
e280: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
e290: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e2a0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
e2b0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
e2c0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
e2d0: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
e2e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e2f0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
e300: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e310: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
e320: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
e330: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
e340: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e350: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
e360: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
e370: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
e380: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
e390: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
e3a0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
e3b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
e3c0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
e3d0: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
e3e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
e3f0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
e400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
e410: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
e420: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
e430: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
e440: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
e450: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e460: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e470: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e480: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e490: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e4a0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e4b0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e4c0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e4d0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e4e0: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e4f0: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e500: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e510: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e520: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e540: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e550: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e560: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e570: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e580: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e590: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e5a0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e5b0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e5c0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e5d0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e5e0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e5f0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e600: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e610: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e620: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e630: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e640: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e650: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e660: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e670: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e680: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e690: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e6a0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e6b0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e6c0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e6d0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e6e0: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e6f0: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e700: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e710: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e720: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e730: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e740: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e750: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e760: 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
e770: 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
e780: 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
e790: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7a0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
e7b0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e7c0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
e7d0: 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
e7e0: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
e7f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
e800: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
e810: 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
e820: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
e830: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
e840: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
e850: 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
e860: 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
e870: 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e  1;.  }.  pLoop->
e880: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
e890: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
e8a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20  RE_IDX_ONLY;..  
e8b0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
e8c0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
e8d0: 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
e8e0: 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d  ndex */.  pIdx =
e8f0: 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
e900: 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72  IndexObject(pPar
e910: 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b  se->db, nKeyCol+
e920: 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  1, 0, &zNotUsed)
e930: 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
e940: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f  ) return;.  pLoo
e950: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
e960: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
e970: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
e980: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
e990: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
e9a0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
e9b0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
e9c0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
e9d0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
e9e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
e9f0: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
ea00: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
ea10: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
ea20: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
ea30: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
ea40: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
ea50: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
ea60: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
ea70: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
ea80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ea90: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
eaa0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eab0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
eac0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
ead0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
eae0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
eaf0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
eb00: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
eb10: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
eb20: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
eb30: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
eb40: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
eb50: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
eb60: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
eb70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eb80: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
eb90: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
eba0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
ebb0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
ebc0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
ebd0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ebe0: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
ebf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
ec00: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
ec10: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
ec20: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
ec30: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
ec40: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
ec50: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ec60: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
ec70: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
ec80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
ec90: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
eca0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
ecb0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
ecc0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ecd0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
ece0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ecf0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
ed00: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
ed10: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
ed20: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
ed30: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
ed40: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
ed50: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
ed60: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
ed70: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
ed80: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ed90: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
eda0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
edb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
edc0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
edd0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ede0: 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61   = -1;.  pIdx->a
edf0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ee00: 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  RY";..  /* Creat
ee10: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
ee20: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
ee30: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
ee40: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
ee50: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
ee60: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
ee70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ee80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
ee90: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
eea0: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
eeb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eec0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
eed0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
eee0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
eef0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
ef00: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
ef10: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
ef20: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
ef30: 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
ef40: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
ef50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
ef60: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
ef70: 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  Cur);.  regRecor
ef80: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
ef90: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efa0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
efb0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
efc0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
efd0: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
efe0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
eff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f000: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f010: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f020: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f030: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f040: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f050: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f060: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f070: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f080: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f090: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
f0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f0b0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
f0c0: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
f0d0: 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
f0e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f0f0: 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
f100: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f110: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
f120: 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
f130: 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
f140: 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
f150: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
f160: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f170: 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
f180: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f190: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
f1a0: 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
f1b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f1c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
f1d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
f1e0: 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
f1f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f200: 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
f210: 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
f220: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
f230: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
f240: 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
f250: 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
f260: 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
f270: 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
f280: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
f290: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
f2a0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
f2b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
f2c0: 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
f2d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f2e0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
f2f0: 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
f300: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
f310: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
f320: 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
f330: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
f340: 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
f350: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
f360: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
f370: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
f380: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
f390: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
f3a0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
f3b0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
f3c0: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
f3d0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f3e0: 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
f3f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
f400: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
f410: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
f420: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
f430: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
f440: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
f450: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
f460: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
f470: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
f480: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
f490: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
f4a0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
f4b0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
f4c0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
f4d0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
f4e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
f4f0: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
f500: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
f510: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
f520: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f530: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f540: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
f550: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f560: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f570: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
f580: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
f590: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
f5a0: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
f5b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f5c0: 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
f5d0: 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
f5e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
f5f0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
f600: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
f610: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72  ntinue;.    nTer
f620: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
f630: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
f640: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
f650: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
f660: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
f670: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
f680: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
f690: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
f6a0: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
f6b0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
f6c0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
f6d0: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
f6e0: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
f6f0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
f700: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
f710: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
f720: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
f730: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
f740: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
f750: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
f760: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
f770: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
f780: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
f790: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
f7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
f7b0: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
f7c0: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
f7d0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
f7e0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
f7f0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f800: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
f810: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
f820: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
f830: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
f840: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
f870: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
f880: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
f890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
f8b0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
f8c0: 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
f8d0: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
f8e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f8f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f900: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
f910: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f920: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
f930: 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
f940: 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
f950: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
f960: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
f970: 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
f980: 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
f990: 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
f9a0: 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
f9b0: 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
f9c0: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
f9d0: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
f9e0: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
f9f0: 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
fa00: 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
fa10: 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
fa20: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
fa30: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fa40: 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
fa50: 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
fa60: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
fa70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
fa80: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
fa90: 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
faa0: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
fab0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
fac0: 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
fad0: 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
fae0: 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
faf0: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
fb00: 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
fb10: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
fb20: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
fb30: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fb40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fb50: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
fb60: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
fb70: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
fb80: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
fb90: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
fba0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
fbb0: 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
fbc0: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
fbd0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fbe0: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
fbf0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
fc00: 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
fc60: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
fc70: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
fc80: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
fc90: 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
fca0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
fcb0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
fcc0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
fcd0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
fce0: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
fcf0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd00: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
fd10: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
fd20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fd30: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
fd40: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
fd50: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
fd60: 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
fd70: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
fd80: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b  ator & WO_ALL );
fd90: 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
fda0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57  >eOperator & ~(W
fdb0: 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49  O_ISNULL|WO_EQUI
fdc0: 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  V))==0 ) continu
fdd0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
fde0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
fdf0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
fe00: 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  e;.    pIdxCons[
fe10: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
fe20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
fe30: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
fe40: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
fe50: 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29  i;.    op = (u8)
fe60: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fe70: 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69   & WO_ALL;.    i
fe80: 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f  f( op==WO_IN ) o
fe90: 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70  p = WO_EQ;.    p
fea0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
feb0: 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  op;.    /* The d
fec0: 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
fed0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
fee0: 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
fef0: 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
ff00: 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
ff10: 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
ff20: 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
ff30: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
ff40: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
ff50: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
ff60: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
ff70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  */.    assert( W
ff80: 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
ff90: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
ffa0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ffb0: 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
ffc0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
ffd0: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
ffe0: 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
fff0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10000 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
10010 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_GT==SQLITE_
10020 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10030 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GT );.    asser
10040 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
10050 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10060 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GE );.    asse
10070 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
10080 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
10090 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
100a0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
100b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
100c0 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54  O_IN|WO_EQ|WO_LT
100d0 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
100e0 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
100f0 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
10100 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
10110 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
10120 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
10130 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
10140 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
10150 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
10160 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
10170 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
10180 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
10190 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
101a0 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
101b0 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
101c0 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
101d0 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
101e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
101f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
10200 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
10210 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
10220 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
10230 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
10240 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
10250 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
10260 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
10270 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
10280 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10290 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
102a0 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68  * comes in as th
102b0 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74  e 3rd argument t
102c0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
102d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
102e0 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
102f0 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
10300 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
10310 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
10320 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
10330 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
10340 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
10350 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
10360 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
10370 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10380 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
10390 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
103a0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
103b0 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
103c0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
103d0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
103e0 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
103f0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
10400 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
10410 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
10420 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
10430 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
10440 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
10450 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
10460 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
10470 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
10480 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
10490 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
104a0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
104b0 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
104c0 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
104d0 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
104e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
104f0 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58  rc;..  TRACE_IDX
10500 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
10510 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
10520 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
10530 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
10540 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
10550 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
10560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
10570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
10580 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
10590 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
105a0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
105b0 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
105c0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
105d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
105e0 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
105f0 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
10600 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10610 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10620 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
10630 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
10640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
10650 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
10660 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
10670 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
10680 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
10690 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
106a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
106b0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
106c0 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
106d0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
106e0 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
106f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10700 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
10710 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
10720 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
10730 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
10740 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
10750 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
10760 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
10770 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
10780 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
107a0 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23  UALTABLE) */...#
107b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
107c0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
107d0 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
107e0 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
107f0 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
10800 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
10810 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
10820 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
10830 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
10840 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
10850 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
10860 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
10870 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
10880 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Val.**    aStat[
10890 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
108a0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
108b0 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20  l to pVal.**.** 
108c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
108d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
108e0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
108f0 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
10900 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10910 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10920 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
10930 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
10940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10950 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
10960 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
10970 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
10980 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20  ord *pRec,      
10990 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61   /* Vector of va
109a0 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  lues to consider
109b0 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
109c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
109d0 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
109e0 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
109f0 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
10a00 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
10a30 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
10a40 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
10a50 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
10a60 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  mple;.  int iCol
10a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10a90 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69  required stats i
10aa0 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f  n anEq[] etc. */
10ab0 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ad0 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
10ae0 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
10af0 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49   */.  int i = pI
10b00 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20  dx->nSample;    
10b10 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
10b20 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
10b30 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
10b40 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74  c */.  int iTest
10b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b60 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c     /* Next sampl
10b70 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69  e to test */.  i
10b80 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
10b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10ba0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
10bb0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
10bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10bd0 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
10be0 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
10bf0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
10c00 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
10c10 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e    iCol = pRec->n
10c20 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73  Field - 1;.  ass
10c30 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
10c40 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
10c50 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
10c60 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
10c70 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64  SampleCol );.  d
10c80 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  o{.    iTest = (
10c90 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72  iMin+i)/2;.    r
10ca0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
10cb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10cc0 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20  ample[iTest].n, 
10cd0 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70  aSample[iTest].p
10ce0 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28  , pRec);.    if(
10cf0 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
10d00 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
10d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10d20 20 69 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20   i = iTest;.    
10d30 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
10d40 26 26 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69  && iMin<i );..#i
10d50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
10d60 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  G.  /* The follo
10d70 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
10d80 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61  ements check tha
10d90 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  t the binary sea
10da0 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62  rch code.  ** ab
10db0 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69  ove found the ri
10dc0 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73  ght answer. This
10dd0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f   block serves no
10de0 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20   purpose other. 
10df0 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f   ** than to invo
10e00 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20  ke the asserts. 
10e10 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
10e20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 28 72   ){.    /* If (r
10e30 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20  es==0) is true, 
10e40 74 68 65 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d  then sample $i m
10e50 75 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20  ust be equal to 
10e60 70 52 65 63 20 2a 2f 0a 20 20 20 20 61 73 73 65  pRec */.    asse
10e70 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
10e80 70 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ple );.    asser
10e90 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62  t( 0==sqlite3Vdb
10ea0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10eb0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
10ec0 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
10ed0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
10ee0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
10ef0 61 69 6c 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65  ailed );.  }else
10f00 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69  {.    /* Otherwi
10f10 73 65 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65  se, pRec must be
10f20 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61   smaller than sa
10f30 6d 70 6c 65 20 24 69 20 61 6e 64 20 6c 61 72 67  mple $i and larg
10f40 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73  er than.    ** s
10f50 61 6d 70 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a  ample ($i-1).  *
10f60 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  /.    assert( i=
10f70 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a  =pIdx->nSample .
10f80 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
10f90 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10fa0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
10fb0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
10fc0 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
10fd0 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
10fe0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
11000 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  0.         || sq
11010 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
11020 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
11030 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
11040 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20  -1].p, pRec)<0. 
11050 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
11060 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
11070 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  led );.  }.#endi
11080 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
11090 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a  E_DEBUG */..  /*
110a0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
110b0 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
110c0 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74  e first sample t
110d0 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
110e0 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61  han.  ** or equa
110f0 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69  l to pVal.  Or i
11100 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
11110 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d  le, then all sam
11120 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20  ples are less.  
11130 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49  ** than pVal.  I
11140 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56  f aSample[i]==pV
11150 61 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e  al, then res==0.
11160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d  .  */.  if( res=
11170 3d 30 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b  =0 ){.    aStat[
11180 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  0] = aSample[i].
11190 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
111a0 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
111b0 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  le[i].anEq[iCol]
111c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
111d0 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69  Rowcnt iLower, i
111e0 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20  Upper, iGap;.   
111f0 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
11200 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
11210 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53       iUpper = aS
11220 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43  ample[0].anLt[iC
11230 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ol];.    }else{.
11240 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 69        iUpper = i
11250 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
11260 3f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  ? pIdx->aiRowEst
11270 5b 30 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] : aSample[i]
11280 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
11290 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
112a0 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43  ple[i-1].anEq[iC
112b0 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d  ol] + aSample[i-
112c0 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  1].anLt[iCol];. 
112d0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31     }.    aStat[1
112e0 5d 20 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43  ] = (pIdx->nKeyC
112f0 6f 6c 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e  ol>iCol ? pIdx->
11300 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31  aAvgEq[iCol] : 1
11310 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  );.    if( iLowe
11320 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
11330 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
11340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
11350 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
11360 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
11370 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
11380 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
11390 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
113a0 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
113b0 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
113c0 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
113d0 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
113e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
113f0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
11400 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
11410 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11420 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
11430 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
11440 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11450 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
11460 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
11470 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
11480 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
11490 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
114a0 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
114b0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
114c0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
114d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
114e0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
114f0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
11500 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
11510 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
11520 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
11530 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
11540 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
11550 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
11560 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
11570 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
11580 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
11590 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
115c0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
115e0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
11610 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
11620 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
11630 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
11640 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
11650 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
11660 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
11670 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
11680 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
11690 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
116a0 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
116b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
116c0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
116d0 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
116e0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
116f0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
11700 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
11710 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
11720 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
11730 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
11740 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
11750 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
11760 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
11770 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
11780 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
11790 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
117a0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
117b0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
117c0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
117d0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
117e0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
117f0 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
11800 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
11810 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
11820 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
11830 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
11840 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
11850 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
11860 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11870 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11880 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
11890 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
118a0 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
118b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
118c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
118d0 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
118e0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
118f0 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
11900 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
11910 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11920 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
11930 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
11940 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
11950 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
11960 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
11970 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74   is 0, this is t
11980 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
11990 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
119a0 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
119b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
119c0 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
119d0 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
119e0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
119f0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
11a00 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
11a10 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
11a20 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
11a30 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
11a40 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
11a50 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
11a60 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68  be.** used, each
11a70 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
11a80 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
11a90 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
11aa0 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
11ab0 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66   Hence a pair of
11ac0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
11ad0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
11ae0 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
11af0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
11b00 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
11b10 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a  actor of 16..*/.
11b20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
11b30 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
11b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11b50 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11b60 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
11b70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
11b80 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11b90 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
11ba0 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
11bb0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
11bc0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
11bd0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
11be0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
11bf0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
11c00 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
11c10 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
11c20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
11c30 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
11c40 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
11c50 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
11c60 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
11c70 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
11c80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
11c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
11ca0 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
11cb0 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
11cc0 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
11cd0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
11ce0 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
11cf0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
11d00 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
11d10 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
11d20 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
11d30 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
11d40 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
11d50 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
11d60 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
11d70 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
11d80 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
11d90 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
11da0 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
11db0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
11dc0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
11dd0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
11de0 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
11df0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
11e00 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
11e10 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
11e20 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
11e30 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
11e40 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
11e50 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
11e60 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
11e70 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
11e80 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
11e90 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
11ea0 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
11eb0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
11ec0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
11ed0 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
11ee0 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
11ef0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
11f00 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
11f10 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
11f20 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
11f30 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
11f40 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
11f50 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
11f60 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
11f70 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
11f80 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
11f90 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
11fa0 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
11fb0 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
11fc0 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
11fd0 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
11fe0 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
11ff0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
12000 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
12010 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
12020 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
12030 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12040 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
12050 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
12060 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
12070 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
12080 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
12090 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
120a0 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
120b0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
120c0 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
120d0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
120e0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
120f0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
12100 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
12110 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
12120 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
12130 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
12140 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
12150 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
12160 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
12170 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
12180 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
12190 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
121a0 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
121b0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
121c0 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
121d0 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
121e0 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
121f0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
12200 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
12210 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
12220 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
12230 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
12240 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20  nEq==p->nKeyCol 
12250 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
12260 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12270 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
12280 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
12290 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
122a0 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
122b0 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
122c0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
122d0 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
122e0 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
122f0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
12300 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
12310 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
12320 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  per = p->aiRowEs
12330 74 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t[0];.    }else{
12340 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  .      /* Note: 
12350 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
12360 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
12370 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
12380 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
12390 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
123a0 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
123b0 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
123c0 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
123d0 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
123e0 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
123f0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
12400 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69  , 0, a);.      i
12410 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
12420 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
12430 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a  ] + a[1];.    }.
12440 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  .    /* If possi
12450 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20  ble, improve on 
12460 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d  the iLower estim
12470 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c  ate using ($P:$L
12480 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  ). */.    if( pL
12490 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  ower ){.      in
124a0 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
124b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
124c0 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
124d0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
124e0 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  pr */.      Expr
124f0 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
12500 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
12510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
12520 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
12530 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
12540 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
12550 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
12560 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
12570 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
12580 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
12590 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66   &bOk);.      if
125a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
125b0 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
125c0 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
125d0 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79          whereKey
125e0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
125f0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
12600 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
12610 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
12620 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29  perator & WO_GT)
12630 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
12640 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69        if( iNew>i
12650 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
12660 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e   iNew;.        n
12670 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Out--;.      }. 
12680 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12690 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
126a0 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
126b0 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
126c0 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69  $P:$U). */.    i
126d0 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
126e0 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12700 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
12710 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
12720 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
12730 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
12740 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
12750 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
12760 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  rt( (pUpper->eOp
12770 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
12780 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
12790 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
127a0 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
127b0 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
127c0 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
127d0 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
127e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
127f0 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
12800 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
12810 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65  New;.        whe
12820 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
12830 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
12840 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20  );.        iNew 
12850 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
12860 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
12870 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30  O_LE) ? a[1] : 0
12880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
12890 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70  New<iUpper ) iUp
128a0 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  per = iNew;.    
128b0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
128c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
128d0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
128e0 70 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63  pRec;.    if( rc
128f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12900 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
12910 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
12920 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
12930 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20  LogEst(iUpper - 
12940 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
12950 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e  else{.        nN
12960 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
12970 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
12980 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
12990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
129a0 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
129b0 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e         nOut = nN
129c0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
129d0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
129e0 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20  (LogEst)nOut;.  
129f0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
12a00 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61  x10, ("range sca
12a10 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25  n regions: %u..%
12a20 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  u  est=%d\n",.  
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77         (u32)iLow
12a50 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c  er, (u32)iUpper,
12a60 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72   nOut));.      r
12a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
12a90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12aa0 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
12ab0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12ac0 70 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69  pBuilder);.#endi
12ad0 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  f.  assert( pLow
12ae0 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
12af0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61    /* TUNING:  Ea
12b00 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ch inequality co
12b10 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73  nstraint reduces
12b20 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
12b30 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41  e 4-fold..  ** A
12b40 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
12b50 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65  r, therefore, re
12b60 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
12b70 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a   space 16-fold *
12b80 2f 0a 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b  /.  nNew = nOut;
12b90 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
12ba0 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67   (pLower->wtFlag
12bb0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
12bc0 3d 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  =0 ){.    nNew -
12bd0 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
12be0 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
12bf0 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
12c00 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69   nOut--;.  }.  i
12c10 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
12c20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20   nNew -= 20;    
12c30 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
12c40 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
12c50 20 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a   );.    nOut--;.
12c60 20 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31    }.  if( nNew<1
12c70 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
12c80 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
12c90 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
12ca0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
12cb0 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
12cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
12cd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12ce0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
12cf0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
12d00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12d10 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
12d20 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
12d30 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
12d40 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
12d50 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
12d60 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
12d70 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
12d80 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
12d90 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
12da0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
12db0 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
12dc0 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
12dd0 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
12de0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
12df0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
12e00 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
12e10 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
12e20 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
12e30 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
12e40 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
12e50 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
12e60 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
12e70 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
12e80 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
12e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ea0 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
12eb0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
12ec0 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
12ed0 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
12ee0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
12ef0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
12f00 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
12f10 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
12f20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
12f30 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
12f40 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
12f50 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
12f60 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
12f70 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
12f80 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
12f90 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
12fa0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
12fb0 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
12fc0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
12fd0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
12fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ff0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
13000 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
13010 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
13020 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
13030 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
13040 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
13050 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
13060 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13070 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
13080 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
13090 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
130a0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
130b0 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
130c0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
130d0 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
130e0 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
130f0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
13100 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
13110 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
13120 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
13130 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
13140 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
13150 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13160 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13170 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
13180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13190 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
131a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131c0 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
131d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
131e0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
131f0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
13200 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
13210 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
13220 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
13230 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43  ( nEq<=(p->nKeyC
13240 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ol+1) );.  asser
13250 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
13260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
13270 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
13280 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
13290 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
132a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
132b0 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
132c0 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
132d0 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
132e0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
132f0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
13300 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
13310 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
13320 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
13330 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
13340 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
13350 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
13360 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
13370 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
13380 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
13390 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
133a0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
133b0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
133c0 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
133d0 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
133e0 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
133f0 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65    if( nEq>p->nKe
13400 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52  yCol ){.    *pnR
13410 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
13420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13430 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
13440 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
13450 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
13460 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
13470 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
13480 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
13490 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
134a0 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
134b0 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
134c0 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
134d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
134e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
134f0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
13500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
13510 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
13520 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
13530 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
13540 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13550 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
13560 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
13570 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
13580 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
13590 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
135a0 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
135b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
135c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
135d0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
135e0 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
135f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13600 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
13610 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
13620 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13630 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
13640 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
13650 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
13660 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
13670 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
13680 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13690 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
136a0 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
136b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
136c0 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
136d0 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
136e0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
136f0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
13700 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
13710 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
13720 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
13730 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
13740 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
13750 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
13760 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
13770 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13780 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
13790 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
137a0 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
137b0 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
137c0 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
137d0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
137e0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
137f0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
13800 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
13810 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
13820 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
13830 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
13840 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
13850 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
13860 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
13870 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
13880 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
13890 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
138a0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
138b0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
138c0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
138d0 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
138e0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
138f0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
13900 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
13910 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
13920 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
13930 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
13940 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
13950 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
13960 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
13970 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
13980 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
13990 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63  ndex;.  int nRec
139a0 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
139b0 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
139c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
139d0 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
139e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
139f0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
13a00 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
13a10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
13a20 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
13a30 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
13a40 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
13a50 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
13a60 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
13a70 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
13a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13a90 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
13aa0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
13ab0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
13ac0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
13ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
13ae0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
13af0 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
13b00 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
13b10 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
13b20 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
13b30 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
13b40 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
13b50 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
13b60 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
13b70 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
13b80 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
13b90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
13ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13bb0 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70   if( nRowEst > p
13bc0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20  ->aiRowEst[0] ) 
13bd0 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
13be0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70  owEst[0];.    *p
13bf0 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
13c00 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
13c10 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  x10,("IN row est
13c20 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22  imate: est=%g\n"
13c30 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
13c40 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
13c50 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
13c60 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
13c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
13c80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
13c90 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
13ca0 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  T4 */../*.** Dis
13cb0 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
13cc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
13cd0 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
13ce0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
13cf0 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
13d00 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
13d10 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
13d20 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
13d30 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
13d40 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
13d50 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
13d60 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
13d70 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
13d80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
13d90 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
13da0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
13db0 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
13dc0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
13dd0 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
13de0 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
13df0 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
13e00 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
13e10 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
13e20 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
13e30 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
13e40 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
13e50 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
13e60 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
13e70 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
13e80 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
13e90 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
13ea0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
13eb0 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
13ec0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
13ed0 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
13ee0 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
13ef0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
13f00 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
13f10 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
13f20 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
13f30 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
13f40 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
13f50 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
13f60 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
13f70 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
13f80 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
13f90 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
13fa0 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
13fb0 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
13fc0 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
13fd0 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
13fe0 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
13ff0 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
14000 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
14010 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
14020 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
14030 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
14040 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
14050 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
14060 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
14070 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
14080 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
14090 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
140a0 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
140b0 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
140c0 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
140d0 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
140e0 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
140f0 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
14100 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
14110 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
14120 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
14130 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
14140 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
14150 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
14160 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
14170 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
14180 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
14190 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
141a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
141b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
141c0 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20  _FromJoin)).    
141d0 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f    && (pLevel->no
141e0 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e  tReady & pTerm->
141f0 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20  prereqAll)==0.  
14200 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
14210 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
14220 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
14230 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
14240 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
14250 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
14260 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
14270 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
14280 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
14290 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
142a0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
142b0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
142c0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
142d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
142e0 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
142f0 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
14300 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
14310 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
14320 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
14330 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
14340 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
14350 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
14360 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
14370 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
14380 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
14390 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
143a0 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
143b0 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
143c0 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
143d0 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
143e0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
143f0 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
14400 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
14410 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14420 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
14430 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
14440 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
14450 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
14460 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
14470 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
14480 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
14490 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
144a0 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
144b0 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
144c0 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
144d0 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
144e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
144f0 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
14500 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
14510 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
14520 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
14530 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
14540 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
14550 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
14560 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
14570 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
14580 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
14590 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
145a0 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
145b0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
145c0 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
145d0 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
145e0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
145f0 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
14600 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
14610 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
14620 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
14630 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
14640 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
14650 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
14660 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
14670 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
14680 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
14690 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
146a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
146b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
146c0 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
146d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
146e0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
146f0 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
14700 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
14710 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
14720 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
14730 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
14740 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
14750 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
14760 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
14770 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
14780 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
14790 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
147a0 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
147b0 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
147c0 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
147d0 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
147e0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
147f0 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
14800 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
14810 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
14820 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
14830 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
14840 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
14850 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
14860 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
14870 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
14880 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
14890 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
148a0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
148b0 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
148c0 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
148d0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
148e0 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
148f0 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
14900 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
14910 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
14920 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14930 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
14940 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
14950 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
14960 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
14970 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14980 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
14990 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
149a0 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65  Level, /* The le
149b0 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
149c0 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
149d0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
149e0 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
149f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
14a00 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
14a10 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65  within this leve
14a20 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  l */.  int bRev,
14a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14a40 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f  ue for reverse-o
14a50 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f  rder IN operatio
14a60 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  ns */.  int iTar
14a70 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
14a80 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
14a90 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
14aa0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
14ab0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
14ac0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
14ad0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14ae0 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
14b10 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
14b20 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
14b30 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
14b40 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
14b50 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
14b60 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
14b70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
14b80 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
14b90 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
14ba0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
14bb0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
14bc0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
14bd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14be0 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
14bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c00 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
14c10 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
14c20 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
14c30 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
14c40 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
14c50 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
14c60 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
14c70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
14c80 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
14c90 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
14ca0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
14cb0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
14cc0 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
14cd0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
14ce0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
14cf0 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
14d00 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
14d10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
14d20 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
14d30 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
14d40 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
14d50 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
14d60 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
14d70 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
14d80 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
14d90 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
14da0 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28   pX, 0);.    if(
14db0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
14dc0 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
14dd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
14de0 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
14df0 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
14e00 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
14e10 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
14e20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14e30 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
14e40 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  : OP_Rewind, iTa
14e50 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  b, 0);.    asser
14e60 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
14e70 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
14e80 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  _OR)==0 );.    p
14e90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
14ea0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a   WHERE_IN_ABLE;.
14eb0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
14ec0 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
14ed0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
14ee0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
14ef0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14f00 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
14f10 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
14f20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
14f30 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
14f40 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
14f50 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
14f60 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
14f70 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
14fa0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
14fb0 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
14fc0 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
14fd0 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
14fe0 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
14ff0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
15000 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
15010 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
15020 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
15030 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
15040 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
15050 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
15060 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
15070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15080 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
15090 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
150a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
150b0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
150c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
150d0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
150e0 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
150f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15100 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20  pIn->eEndLoopOp 
15110 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
15120 49 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74  IfOpen : OP_Next
15130 49 66 4f 70 65 6e 3b 0a 20 20 20 20 20 20 73 71  IfOpen;.      sq
15140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15150 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52  v, OP_IsNull, iR
15160 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eg);.    }else{.
15170 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e        pLevel->u.
15180 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  in.nIn = 0;.    
15190 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
151a0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
151b0 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
151c0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
151d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
151e0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
151f0 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
15200 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
15210 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63  r an.** index sc
15220 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  an..**.** For ex
15230 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
15240 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
15250 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
15260 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
15270 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
15280 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
15290 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
152a0 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
152b0 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
152c0 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
152d0 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
152e0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
152f0 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
15300 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
15310 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
15320 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
15330 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
15340 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
15350 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
15360 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
15370 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
15380 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
15390 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
153a0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
153b0 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
153c0 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
153d0 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
153e0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
153f0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
15400 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
15410 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
15420 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
15430 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
15440 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
15450 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
15460 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
15470 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
15480 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
15490 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
154a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
154b0 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
154c0 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
154d0 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
154e0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
154f0 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
15500 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
15510 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
15520 52 65 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Reg parameter is
15530 20 30 20 6f 72 20 31 2e 20 20 49 74 20 69 73 20   0 or 1.  It is 
15540 30 20 69 66 20 61 6c 6c 20 57 48 45 52 45 20 63  0 if all WHERE c
15550 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
15560 73 0a 2a 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49  s.** are == or I
15570 4e 20 61 6e 64 20 61 72 65 20 63 6f 76 65 72 65  N and are covere
15580 64 20 62 79 20 74 68 65 20 6e 45 71 2e 20 20 6e  d by the nEq.  n
15590 45 78 74 72 61 52 65 67 20 69 73 20 31 20 69 66  ExtraReg is 1 if
155a0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
155b0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
155c0 72 61 69 6e 74 20 28 73 75 63 68 20 61 73 20 74  raint (such as t
155d0 68 65 20 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31  he "c>=5 AND c<1
155e0 30 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  0" in the exampl
155f0 65 29 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72  e) that.** occur
15600 73 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  s after the nEq 
15610 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15620 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nts..**.** This 
15630 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
15640 73 20 61 20 72 61 6e 67 65 20 6f 66 20 6e 45 71  s a range of nEq
15650 2b 6e 45 78 74 72 61 52 65 67 20 6d 65 6d 6f 72  +nExtraReg memor
15660 79 20 63 65 6c 6c 73 20 61 6e 64 20 72 65 74 75  y cells and retu
15670 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
15680 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6d 65   of the first me
15690 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 61  mory cell in tha
156a0 74 20 72 61 6e 67 65 2e 20 54 68 65 20 63 6f 64  t range. The cod
156b0 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
156c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
156d0 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
156e0 79 20 72 61 6e 67 65 20 74 6f 20 73 74 6f 72 65  y range to store
156f0 20 6b 65 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61   keys for.** sta
15700 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 69  rt and terminati
15710 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66  on conditions of
15720 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65   the loop..** ke
15730 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
15740 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
15750 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
15760 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
15770 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
15780 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
15790 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
157a0 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
157b0 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a  rnal.** use..**.
157c0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
157d0 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73  ing, *pzAff is s
157e0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
157f0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15800 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  ng a.** copy of 
15810 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
15820 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68  ity string of th
15830 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65  e index allocate
15840 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
15850 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78  e3DbMalloc(). Ex
15860 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e  cept, entries in
15870 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
15880 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
15890 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c  ed.** with equal
158a0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
158b0 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66  that use NONE af
158c0 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
158d0 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
158e0 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f  NONE. This is to
158f0 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
15900 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
15910 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
15920 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
15930 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
15940 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
15950 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
15960 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
15970 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
15980 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
15990 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
159a0 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
159b0 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
159c0 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
159d0 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
159e0 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
159f0 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
15a00 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  has NONE affinit
15a10 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73  y,.** no convers
15a20 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ion should be at
15a30 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75  tempted before u
15a40 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75  sing a t2.b valu
15a50 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  e as part of.** 
15a60 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20  a key to search 
15a70 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65  the index. Hence
15a80 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
15a90 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
15aa0 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
15ab0 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70  ng in this examp
15ac0 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  le would be set 
15ad0 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  to SQLITE_AFF_NO
15ae0 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NE..*/.static in
15af0 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
15b00 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
15b10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15b20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15b30 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
15b40 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
15b50 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
15b60 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
15b70 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
15b80 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
15b90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72          /* Rever
15ba0 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
15bb0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
15bc0 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
15bd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15be0 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
15bf0 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
15c00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
15c10 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
15c20 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
15c30 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
15c40 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ing */.){.  u16 
15c50 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
15c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15c70 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
15c80 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
15c90 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  to code */.  u16
15ca0 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   nSkip;         
15cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15cc0 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73  mber of left-mos
15cd0 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69  t columns to ski
15ce0 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  p */.  Vdbe *v =
15cf0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
15d00 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
15d10 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15d20 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
15d30 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
15d40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
15d50 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
15d60 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
15d70 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
15d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15d90 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
15da0 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57  aint term */.  W
15db0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15dd0 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
15de0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ject */.  int j;
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15e10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
15e20 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
15e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
15e40 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
15e50 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20   int nReg;      
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
15e80 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
15e90 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  e */.  char *zAf
15ea0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
15eb0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
15ec0 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   string to retur
15ed0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n */..  /* This 
15ee0 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63  module is only c
15ef0 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70  alled on query p
15f00 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e  lans that use an
15f10 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f   index. */.  pLo
15f20 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
15f30 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28  oop;.  assert( (
15f40 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
15f50 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
15f60 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71  BLE)==0 );.  nEq
15f70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
15f80 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d  e.nEq;.  nSkip =
15f90 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
15fa0 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20  nSkip;.  pIdx = 
15fb0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
15fc0 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28  Index;.  assert(
15fd0 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f   pIdx!=0 );..  /
15fe0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
15ff0 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
16000 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
16010 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
16020 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
16030 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
16040 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
16050 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
16060 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
16070 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
16080 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
16090 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
160a0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
160b0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
160c0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
160d0 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
160e0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
160f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
16100 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b  ;.  }..  if( nSk
16110 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  ip ){.    int iI
16120 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
16130 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c  iIdxCur;.    sql
16140 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16150 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a  , (bRev?OP_Last:
16160 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78  OP_Rewind), iIdx
16170 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Cur);.    VdbeCo
16180 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
16190 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
161a0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
161b0 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
161c0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
161d0 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65  P_Goto);.    pLe
161e0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20  vel->addrSkip = 
161f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16200 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50  4Int(v, (bRev?OP
16210 5f 53 65 65 6b 4c 74 3a 4f 50 5f 53 65 65 6b 47  _SeekLt:OP_SeekG
16220 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42  iIdxCur, 0, regB
16250 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20  ase, nSkip);.   
16260 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16270 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20  Here(v, j);.    
16280 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70  for(j=0; j<nSkip
16290 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
162a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
162b0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
162c0 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73  dxCur, j, regBas
162d0 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e+j);.      asse
162e0 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
162f0 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[j]>=0 );.    
16300 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16310 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70 54  , "%s", pIdx->pT
16320 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  able->aCol[pIdx-
16330 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
16340 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
16350 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75      ..  /* Evalu
16360 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
16370 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
16380 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  /.  assert( zAff
16390 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c  ==0 || (int)strl
163a0 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b  en(zAff)>=nEq );
163b0 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20  .  for(j=nSkip; 
163c0 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
163d0 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65   int r1;.    pTe
163e0 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
163f0 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[j];.    asser
16400 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
16410 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
16420 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73 20  ing testcase is 
16430 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
16440 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
16450 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
16460 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
16470 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
16480 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
16490 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
164a0 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
164b0 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
164c0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
164d0 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
164e0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
164f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
16500 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72  VIRTUAL );.    r
16510 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
16520 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
16530 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
16540 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  Rev, regBase+j);
16550 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
16560 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
16570 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
16580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
16590 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
165a0 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
165b0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
165c0 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
165d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
165e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
165f0 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
16600 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
16610 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
16620 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
16630 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
16640 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
16650 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
16660 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
16670 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
16680 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
16690 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
166a0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
166b0 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
166c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
166d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
166e0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
166f0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
16700 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
16710 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  rBrk);.      if(
16720 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20   zAff ){.       
16730 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
16740 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
16750 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51  ht, zAff[j])==SQ
16760 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
16770 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
16780 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
16790 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
167a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
167b0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
167c0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
167d0 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b  ght, zAff[j]) ){
167e0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
167f0 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
16800 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
16810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16820 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66  }.  *pzAff = zAf
16830 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  f;.  return regB
16840 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ase;.}..#ifndef 
16850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
16860 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  AIN./*.** This r
16870 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70  outine is a help
16880 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e  er for explainIn
16890 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77  dexRange() below
168a0 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64  .**.** pStr hold
168b0 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e  s the text of an
168c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
168d0 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67   we are building
168e0 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20   up one term.** 
168f0 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
16900 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20   routine adds a 
16910 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20  new term to the 
16920 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65  end of the expre
16930 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20  ssion..** Terms 
16940 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79  are separated by
16950 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20   AND so add the 
16960 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73  "AND" text for s
16970 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71  econd and subseq
16980 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  uent.** terms on
16990 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
169a0 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64  id explainAppend
169b0 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d  Term(.  StrAccum
169c0 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20   *pStr,         
169d0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
169e0 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
169f0 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20   built */.  int 
16a00 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iTerm,          
16a10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16a20 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20   of this term.  
16a30 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f  First is zero */
16a40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16a50 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f  Column,        /
16a60 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
16a70 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
16a80 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20  char *zOp       
16a90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16aa0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   the operator */
16ab0 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20  .){.  if( iTerm 
16ac0 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
16ad0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
16ae0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c  AND ", 5);.  sql
16af0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
16b00 6e 64 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c  ndAll(pStr, zCol
16b10 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  umn);.  sqlite3S
16b20 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
16b30 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73  tr, zOp, 1);.  s
16b40 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
16b50 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20  pend(pStr, "?", 
16b60 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  1);.}../*.** Arg
16b70 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73  ument pLevel des
16b80 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67  cribes a strateg
16b90 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  y for scanning t
16ba0 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20  able pTab. This 
16bb0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
16bc0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
16bd0 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
16be0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64  r containing a d
16bf0 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
16c00 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74   the subset of t
16c10 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65  able rows scanne
16c20 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67  d by the strateg
16c30 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  y in the form of
16c40 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65   an.** SQL expre
16c50 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c  ssion. Or, if al
16c60 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e  l rows are scann
16c70 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
16c80 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  rned..**.** For 
16c90 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
16ca0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
16cb0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
16cc0 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e  WHERE a=1 AND b>
16cd0 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20  2;.**.** is run 
16ce0 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
16cf0 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
16d00 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
16d10 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a  ion returns a.**
16d20 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20   string similar 
16d30 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f  to:.**.**   "a=?
16d40 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20   AND b>?".**.** 
16d50 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  The returned poi
16d60 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d  nter points to m
16d70 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
16d80 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
16d90 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
16da0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
16db0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
16dc0 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66   to free the buf
16dd0 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  fer when it is.*
16de0 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * no longer requ
16df0 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
16e00 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64  char *explainInd
16e10 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20  exRange(sqlite3 
16e20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
16e30 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54  pLoop, Table *pT
16e40 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
16e50 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
16e60 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
16e70 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
16e80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
16e90 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  u16 nSkip = pLoo
16ea0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
16eb0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
16ec0 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
16ed0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36  Tab->aCol;.  i16
16ee0 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e   *aiColumn = pIn
16ef0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20  dex->aiColumn;. 
16f00 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a   StrAccum txt;..
16f10 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
16f20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
16f30 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
16f40 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
16f50 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IT))==0 ){.    r
16f60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
16f70 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
16f80 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53  it(&txt, 0, 0, S
16f90 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
16fa0 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62  );.  txt.db = db
16fb0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
16fc0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
16fd0 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
16fe0 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
16ff0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
17000 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  (i==pIndex->nKey
17010 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20  Col ) ? "rowid" 
17020 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
17030 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  i]].zName;.    i
17040 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20  f( i>=nSkip ){. 
17050 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65       explainAppe
17060 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
17070 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c  z, "=");.    }el
17080 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20  se{.      if( i 
17090 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
170a0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
170b0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20  AND ", 5);.     
170c0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
170d0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e  Append(&txt, "AN
170e0 59 28 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73  Y(", 4);.      s
170f0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
17100 70 65 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29  pendAll(&txt, z)
17110 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17120 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
17130 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20  xt, ")", 1);.   
17140 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b   }.  }..  j = i;
17150 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
17160 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  Flags&WHERE_BTM_
17170 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61  LIMIT ){.    cha
17180 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65  r *z = (j==pInde
17190 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22  x->nKeyCol ) ? "
171a0 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
171b0 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
171c0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
171d0 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b  endTerm(&txt, i+
171e0 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a  +, z, ">");.  }.
171f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
17200 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
17210 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
17220 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78   *z = (j==pIndex
17230 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72  ->nKeyCol ) ? "r
17240 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
17250 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
17260 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
17270 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
17280 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73  z, "<");.  }.  s
17290 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
172a0 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20  pend(&txt, ")", 
172b0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1);.  return sql
172c0 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
172d0 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a  sh(&txt);.}../*.
172e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
172f0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
17300 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  ss currently pro
17310 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41  cessing an EXPLA
17320 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a  IN QUERY PLAN.**
17330 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65   command. If the
17340 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d   query being com
17350 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c  piled is an EXPL
17360 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20  AIN QUERY PLAN, 
17370 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f  a single.** reco
17380 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  rd is added to t
17390 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
173a0 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
173b0 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
173c0 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a   .** pLevel..*/.
173d0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
173e0 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61  ainOneScan(.  Pa
173f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17410 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
17420 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
17430 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
17440 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73      /* Table lis
17450 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65  t this loop refe
17460 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65  rs to */.  Where
17470 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
17480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
17490 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45  an to write OP_E
174a0 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f  xplain opcode fo
174b0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  r */.  int iLeve
174c0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
174d0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
174e0 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75  for "level" colu
174f0 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
17500 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
17530 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  from" column of 
17540 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20  output */.  u16 
17550 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
17560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17570 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
17580 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
17590 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
175a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
175b0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
175c0 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a  ain==2 ).#endif.
175d0 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53    {.    struct S
175e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
175f0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
17600 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
17610 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
17620 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
17630 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
17640 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20  constructed */. 
17650 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
17660 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
17670 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
17680 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  dle */.    char 
17690 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20  *zMsg;          
176a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
176b0 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f   to add to EQP o
176c0 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74  utput */.    int
176d0 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69   iId = pParse->i
176e0 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65  SelectId;  /* Se
176f0 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f  lect id (left-mo
17700 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  st output column
17710 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53  ) */.    int isS
17720 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
17730 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
17740 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c  or a SEARCH. Fal
17750 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a  se for SCAN. */.
17760 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
17770 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
17780 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c    /* The control
17790 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ling WhereLoop o
177a0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32  bject */.    u32
177b0 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
177c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
177d0 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ags that describ
177e0 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a  e this loop */..
177f0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
17800 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
17810 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  flags = pLoop->w
17820 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  sFlags;.    if( 
17830 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  (flags&WHERE_MUL
17840 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
17850 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54  Flags&WHERE_ONET
17860 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74  ABLE_ONLY) ) ret
17870 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72  urn;..    isSear
17880 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45  ch = (flags&(WHE
17890 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
178a0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
178b0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
178c0 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56   ((flags&WHERE_V
178d0 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
178e0 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  && (pLoop->u.btr
178f0 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20  ee.nEq>0)).     
17900 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c         || (wctrl
17910 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44  Flags&(WHERE_ORD
17920 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f  ERBY_MIN|WHERE_O
17930 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20  RDERBY_MAX));.. 
17940 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17950 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
17960 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41  ", isSearch?"SEA
17970 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20  RCH":"SCAN");.  
17980 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
17990 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lect ){.      zM
179a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
179b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
179c0 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
179d0 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65   zMsg,pItem->iSe
179e0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  lectId);.    }el
179f0 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  se{.      zMsg =
17a00 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17a10 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54  (db, zMsg, "%s T
17a20 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20  ABLE %s", zMsg, 
17a30 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
17a40 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
17a50 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
17a60 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
17a70 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
17a80 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22  zMsg, "%s AS %s"
17a90 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
17aa0 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
17ab0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
17ac0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
17ad0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d  VIRTUALTABLE))==
17ae0 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53  0.     && ALWAYS
17af0 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  (pLoop->u.btree.
17b00 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29  pIndex!=0).    )
17b10 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  {.      char *zW
17b20 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e  here = explainIn
17b30 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f  dexRange(db, pLo
17b40 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  op, pItem->pTab)
17b50 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
17b60 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
17b70 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  b, zMsg,.       
17b80 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
17b90 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
17ba0 45 58 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20  EX) ? .         
17bb0 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53            "%s US
17bc0 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73  ING AUTOMATIC %s
17bd0 49 4e 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20  INDEX%.0s%s" :. 
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 20 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e    "%s USING %sIN
17c00 44 45 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20  DEX %s%s"), .   
17c10 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67              zMsg
17c20 2c 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52  , ((flags & WHER
17c30 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43  E_IDX_ONLY) ? "C
17c40 4f 56 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c  OVERING " : ""),
17c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c60 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
17c70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57  Index->zName, zW
17c80 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  here);.      sql
17c90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
17ca0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
17cb0 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
17cc0 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20  HERE_IPK)!=0 && 
17cd0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
17ce0 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b  ONSTRAINT)!=0 ){
17cf0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
17d00 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
17d10 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
17d20 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
17d30 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a  Y KEY", zMsg);..
17d40 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26        if( flags&
17d50 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  (WHERE_COLUMN_EQ
17d60 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
17d70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
17d80 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17d90 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17da0 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d  s (rowid=?)", zM
17db0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
17dc0 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
17dd0 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
17de0 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
17df0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
17e00 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17e10 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
17e20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77  (rowid>? AND row
17e30 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
17e40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
17e50 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
17e60 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
17e70 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17e80 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17e90 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c   "%s (rowid>?)",
17ea0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
17eb0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 66  lse if( ALWAYS(f
17ec0 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
17ed0 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20  IMIT) ){.       
17ee0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17ef0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
17f00 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22  , "%s (rowid<?)"
17f10 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
17f20 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
17f30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17f40 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65  ALTABLE.    else
17f50 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
17f60 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
17f70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d  )!=0 ){.      zM
17f80 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
17f90 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
17fa0 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
17fb0 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
17fc0 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
17fd0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
17fe0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f  vtab.idxNum, pLo
17ff0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
18000 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
18010 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
18020 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
18030 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67  zMsg, "%s", zMsg
18040 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18050 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
18060 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
18070 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
18080 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
18090 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
180a0 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  ine explainOneSc
180b0 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  an(u,v,w,x,y,z).
180c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
180d0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
180e0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
180f0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
18100 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
18110 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
18120 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
18130 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
18140 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
18150 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
18160 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
18170 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
18180 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
18190 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
181a0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
181b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
181c0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
181d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
181e0 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
181f0 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
18200 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74  e coded */.  Bit
18210 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
18220 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65    /* Which table
18230 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
18240 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a  available */.){.
18250 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20    int j, k;     
18260 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18270 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
18280 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
18290 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
182a0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
182b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
182c0 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Nxt;         /* 
182d0 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f  Where to jump to
182e0 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
182f0 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20  he next IN case 
18300 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  */.  int omitTab
18310 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le;       /* Tru
18320 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
18330 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
18340 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
18350 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
18360 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
18370 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
18380 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
18390 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68   *pLevel;  /* Th
183a0 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f  e where level to
183b0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
183c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
183d0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
183e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e  Loop object bein
183f0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  g coded */.  Whe
18400 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
18410 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
18420 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  on of the entire
18430 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18440 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
18450 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
18460 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c     /* A WHERE cl
18470 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50  ause term */.  P
18480 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
184a0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
184b0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
184c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
184d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
184e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
184f0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18510 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
18520 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
18530 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
18540 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18550 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
18560 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
18570 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
18580 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
18590 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
185a0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
185b0 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
185c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
185d0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
18600 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
18610 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
18620 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
18630 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
18640 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
18650 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
18660 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
18670 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
18680 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
18690 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
186a0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
186b0 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
186c0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
186d0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
186e0 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26  pVdbe;.  pWC = &
186f0 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64  pWInfo->sWC;.  d
18700 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18710 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
18720 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
18730 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
18740 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49  >pWLoop;.  pTabI
18750 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
18760 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
18770 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75  l->iFrom];.  iCu
18780 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
18790 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d  ursor;.  pLevel-
187a0 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52  >notReady = notR
187b0 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28  eady & ~getMask(
187c0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
187d0 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76  t, iCur);.  bRev
187e0 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
187f0 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
18800 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
18810 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
18820 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
18830 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
18840 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
18850 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
18860 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20  RCE_TABLE)==0;. 
18870 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
18880 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48  nt((v, "Begin WH
18890 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
188a0 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d  iLevel,pTabItem-
188b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
188c0 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62  .  /* Create lab
188d0 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
188e0 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
188f0 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
18900 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
18910 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
18920 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62   to addrBrk to b
18930 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f  reak out of a lo
18940 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  op..  ** Jump to
18950 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
18960 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
18970 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
18980 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a   the.  ** loop..
18990 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
189a0 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
189b0 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
189c0 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22  have a "addrNxt"
189d0 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a   label that.  **
189e0 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e   means to contin
189f0 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
18a00 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e   IN value combin
18a10 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a  ation.  When.  *
18a20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
18a30 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
18a40 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
18a50 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61  the "addrNxt" la
18a60 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  bel.  ** is the 
18a70 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b  same as "addrBrk
18a80 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72  "..  */.  addrBr
18a90 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
18aa0 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
18ab0 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
18ac0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18ad0 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c  .  addrCont = pL
18ae0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d  evel->addrCont =
18af0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18b00 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
18b10 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
18b20 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
18b30 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
18b40 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20   allocate and.  
18b50 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
18b60 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
18b70 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
18b80 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
18b90 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ny.  ** row of t
18ba0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
18bb0 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
18bc0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
18bd0 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
18be0 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
18bf0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
18c00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
18c10 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65  tJoin = ++pParse
18c20 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
18c30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18c40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18c50 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
18c60 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
18c70 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
18c80 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
18c90 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20   flag"));.  }.. 
18ca0 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
18cb0 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
18cc0 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65  e subquery imple
18cd0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
18ce0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  outine */.  if( 
18cf0 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72  pTabItem->viaCor
18d00 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
18d10 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
18d20 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
18d30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18d40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18d50 74 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d  teger, pTabItem-
18d60 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20  >addrFillSub-1, 
18d70 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70  regYield);.    p
18d80 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c  Level->p2 =  sql
18d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18da0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
18db0 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43  ield);.    VdbeC
18dc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
18dd0 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69   row of co-routi
18de0 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d  ne %s", pTabItem
18df0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
18e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
18e20 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64   regYield+1, add
18e30 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
18e40 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b  l->op = OP_Goto;
18e50 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
18e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18e70 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
18e80 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
18e90 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
18ea0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
18eb0 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68    /* Case 1:  Th
18ec0 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
18ed0 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
18ee0 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
18ef0 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
18f00 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
18f10 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
18f20 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
18f30 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
18f40 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
18f50 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
18f60 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43  ound;.    int nC
18f70 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f  onstraint = pLoo
18f80 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20  p->nLTerm;..    
18f90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18fa0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18fb0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
18fc0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
18fd0 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
18fe0 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74  +2);.    addrNot
18ff0 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
19000 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72  addrBrk;.    for
19010 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
19020 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
19030 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69   int iTarget = i
19040 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70  Reg+j+2;.      p
19050 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
19060 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
19070 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
19080 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
19090 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
190a0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
190b0 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
190c0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
190d0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
190e0 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b   bRev, iTarget);
190f0 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74  .        addrNot
19100 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
19110 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d  addrNxt;.      }
19120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
19130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
19140 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
19150 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pr->pRight, iTar
19160 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
19170 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
19180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19190 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e  Integer, pLoop->
191a0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69  u.vtab.idxNum, i
191b0 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
191c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
191d0 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73  P_Integer, nCons
191e0 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b  traint, iReg+1);
191f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19200 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
19210 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
19220 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a  NotFound, iReg,.
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19240 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
19250 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20  tab.idxStr,.    
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
19280 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50  needFree ? P4_MP
19290 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
192a0 43 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  C);.    pLoop->u
192b0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
192c0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
192d0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
192e0 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
192f0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
19300 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
19310 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
19320 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
19330 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
19340 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
19350 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
19360 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
19370 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
19380 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
19390 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
193a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
193b0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
193c0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
193d0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
193e0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
193f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19400 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
19410 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
19420 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19430 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
19440 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
19450 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
19460 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c  PK)!=0.   && (pL
19470 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
19480 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
19490 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
194a0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
194b0 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e   Case 2:  We can
194c0 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
194d0 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
194e0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
194f0 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
19500 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19510 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19520 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
19530 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
19540 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
19550 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
19560 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
19570 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
19580 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
19590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
195a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  op->u.btree.nEq=
195b0 3d 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61  =1 );.    iRelea
195c0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
195d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
195e0 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
195f0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
19600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
19610 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
19620 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
19630 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
19640 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
19650 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
19660 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
19670 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
19680 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  );.    iRowidReg
19690 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
196a0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
196b0 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
196c0 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
196d0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
196e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
196f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19700 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
19710 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
19720 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
19730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19740 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
19750 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
19760 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
19770 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19780 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
19790 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
197a0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
197b0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
197c0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
197d0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
197e0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
197f0 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
19800 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19810 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
19820 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
19830 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
19840 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
19850 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
19860 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
19870 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
19880 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
19890 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
198a0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
198b0 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
198c0 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
198d0 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
198e0 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
198f0 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
19900 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
19910 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19920 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
19930 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
19940 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
19950 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
19960 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
19970 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
19980 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
19990 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
199a0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
199b0 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
199c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
199d0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
199e0 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
199f0 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
19a00 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
19a10 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
19a20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
19a30 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
19a40 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
19a50 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
19a60 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
19a70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
19a80 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
19a90 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
19aa0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
19ab0 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
19ac0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
19ad0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
19ae0 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
19af0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
19b00 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
19b10 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
19b20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
19b30 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
19b40 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
19b50 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
19b60 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
19b70 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
19b80 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
19b90 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
19ba0 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
19bb0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
19bc0 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
19bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
19be0 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
19bf0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
19c00 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
19c10 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
19c20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
19c30 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
19c40 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
19c50 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
19c60 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
19c70 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
19c80 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
19c90 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
19ca0 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
19cb0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
19cc0 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
19cd0 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
19ce0 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
19cf0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
19d00 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
19d10 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
19d20 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
19d30 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
19d40 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
19d50 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
19d60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19d70 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
19d80 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
19d90 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
19da0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
19db0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
19dc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19dd0 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
19de0 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
19df0 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
19e00 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
19e10 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
19e20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19e30 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
19e40 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
19e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19e60 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
19e70 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
19e80 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
19e90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19ea0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
19eb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19ec0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
19ed0 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
19ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19ef0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19f00 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
19f10 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
19f20 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
19f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f50 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
19f60 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
19f70 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
19f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19f90 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
19fa0 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
19fb0 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
19fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
19fd0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
19fe0 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
19ff0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1a000 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1a010 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
1a020 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1a030 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
1a040 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1a050 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1a060 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1a070 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1a080 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1a090 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a0a0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1a0b0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1a0c0 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1a0d0 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1a0e0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1a0f0 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1a100 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1a110 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1a120 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1a130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a140 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1a150 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1a160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a170 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1a180 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1a190 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1a1a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a1b0 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1a1c0 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1a1d0 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1a1e0 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1a1f0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1a200 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1a210 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1a220 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1a230 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1a240 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1a250 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1a260 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1a270 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1a280 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1a290 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a2a0 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1a2b0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1a2c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a2d0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1a2e0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1a2f0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1a300 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a310 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1a320 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1a330 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1a340 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a350 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1a360 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1a370 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1a380 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1a390 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1a3a0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1a3b0 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
1a3c0 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
1a3d0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1a3e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1a3f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1a400 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1a410 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1a420 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1a430 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1a440 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1a450 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1a460 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1a470 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1a480 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1a490 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1a4a0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1a4b0 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1a4c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1a4d0 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1a4e0 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1a4f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1a500 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1a510 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1a520 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1a530 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1a540 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1a550 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1a560 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1a570 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1a580 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a590 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1a5a0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1a5b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1a5c0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1a5d0 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1a5e0 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1a5f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1a600 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1a610 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1a620 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1a630 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1a640 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1a650 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1a660 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1a670 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1a680 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1a690 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1a6a0 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1a6c0 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1a6d0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1a6e0 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1a6f0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1a700 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1a710 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1a720 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1a730 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1a740 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a750 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1a760 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a770 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1a780 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1a790 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1a7a0 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1a7b0 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1a7c0 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1a7d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1a7e0 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1a7f0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1a800 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1a810 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1a820 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1a830 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1a840 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1a850 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1a860 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1a870 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1a880 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1a890 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1a8a0 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1a8b0 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1a8c0 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1a8d0 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1a8e0 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1a8f0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1a900 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1a910 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1a920 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1a930 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1a940 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1a950 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1a960 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1a970 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1a980 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1a990 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1a9a0 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1a9b0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1a9c0 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
1a9d0 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1a9e0 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1a9f0 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1aa00 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1aa10 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
1aa20 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1aa30 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1aa40 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1aa50 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
1aa60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1aa70 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1aa80 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1aa90 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1aaa0 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
1aab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1aac0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1aad0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1aae0 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1aaf0 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1ab00 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1ab10 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
1ab20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1ab30 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
1ab40 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
1ab50 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1ab60 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1ab70 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1ab80 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1ab90 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
1aba0 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
1abb0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1abc0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1abd0 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c      u16 nEq = pL
1abe0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1abf0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1ac00 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
1ac10 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
1ac20 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
1ac30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1ac40 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1ac50 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
1ac60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1ac70 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1ac80 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1ac90 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1aca0 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1acb0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
1ace0 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
1acf0 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
1ad00 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
1ad10 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ad20 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
1ad30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1ad40 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
1ad50 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
1ad60 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1ad70 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
1ad80 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ada0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1adb0 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
1adc0 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1add0 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1adf0 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
1ae00 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1ae10 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
1ae20 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
1ae30 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
1ae40 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
1ae50 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
1ae60 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ae80 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
1ae90 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
1aea0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aec0 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
1aed0 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
1aee0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1af10 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1af20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
1af30 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
1af40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1af50 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
1af60 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
1af70 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af90 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
1afa0 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
1afb0 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
1afc0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
1afd0 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
1afe0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1aff0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 45 6e   */.    char cEn
1b000 64 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  dAff = 0;       
1b010 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1b020 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
1b030 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
1b040 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  .    pIdx = pLoo
1b050 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1b060 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
1b070 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1b080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
1b090 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  q>=pLoop->u.btre
1b0a0 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20  e.nSkip );..    
1b0b0 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
1b0c0 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
1b0d0 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
1b0e0 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
1b0f0 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
1b100 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1b110 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
1b120 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
1b130 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
1b140 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
1b150 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
1b160 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
1b170 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
1b180 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
1b190 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
1b1a0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
1b1b0 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
1b1c0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
1b1d0 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
1b1e0 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
1b1f0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
1b200 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
1b210 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
1b220 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
1b230 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
1b240 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
1b250 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
1b260 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
1b270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b280 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1b290 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1b2a0 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26  Y_MIN)!=0.     &
1b2b0 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61  & (pWInfo->bOBSa
1b2c0 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70  t!=0).     && (p
1b2d0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71  Idx->nKeyCol>nEq
1b2e0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  ).    ){.      a
1b2f0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1b300 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 20 29  btree.nSkip==0 )
1b310 3b 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  ;.      isMinQue
1b320 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1b330 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1b340 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1b350 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1b360 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1b370 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1b380 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1b390 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1b3a0 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1b3b0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b3c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b3d0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1b3e0 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1b3f0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1b400 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1b410 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1b420 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1b430 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1b440 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1b450 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1b460 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1b470 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1b480 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1b490 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b4a0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1b4b0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1b4c0 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1b4d0 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1b4e0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1b4f0 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1b500 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1b510 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1b520 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1b530 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1b540 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1b550 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
1b560 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
1b570 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
1b580 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  tAff);.    asser
1b590 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20  t( zStartAff==0 
1b5a0 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  || sqlite3Strlen
1b5b0 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e  30(zStartAff)>=n
1b5c0 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  Eq );.    if( zS
1b5d0 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41 66  tartAff ) cEndAf
1b5e0 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  f = zStartAff[nE
1b5f0 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  q];.    addrNxt 
1b600 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1b610 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
1b620 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
1b630 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
1b640 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
1b650 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
1b660 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
1b670 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
1b680 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
1b690 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
1b6a0 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
1b6b0 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
1b6c0 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
1b6d0 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
1b6e0 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
1b6f0 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d  nKeyCol && bRev=
1b700 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
1b710 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
1b720 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
1b730 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
1b740 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20  nKeyCol==nEq).  
1b750 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
1b760 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
1b770 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
1b780 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  art);.    }..   
1b790 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1b7a0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1b7b0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1b7c0 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1b7d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b7e0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1b7f0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1b800 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1b810 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1b820 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1b830 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1b840 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1b850 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1b860 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1b870 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1b880 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1b890 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  0 );.    startEq
1b8a0 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
1b8b0 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
1b8c0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1b8d0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
1b8e0 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
1b8f0 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
1b900 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1b910 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1b920 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1b930 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
1b940 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
1b950 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
1b960 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
1b970 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
1b980 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
1b990 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1b9a0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1b9b0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1b9c0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
1b9d0 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
1b9e0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1b9f0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1ba00 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
1ba10 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1ba20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
1ba30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1ba40 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
1ba50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ba60 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
1ba70 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
1ba80 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
1ba90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1baa0 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b  if( zStartAff ){
1bab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1bac0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1bad0 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61  ity(pRight, zSta
1bae0 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  rtAff[nEq])==SQL
1baf0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
1bb00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
1bb10 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
1bb20 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
1bb30 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
1bb40 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
1bb50 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
1bb60 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
1bb70 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
1bb80 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
1bb90 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
1bba0 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
1bbb0 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
1bbc0 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
1bbd0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1bbe0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1bbf0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1bc00 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
1bc10 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
1bc20 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
1bc30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1bc40 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
1bc50 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1bc60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bc70 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e    }  .      nCon
1bc80 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
1bc90 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1bca0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
1bcb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1bcc0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bcd0 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
1bce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bcf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1bd00 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1bd10 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
1bd20 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
1bd30 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
1bd40 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1bd50 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
1bd60 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1bd70 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1bd80 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1bd90 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1bda0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
1bdb0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1bdc0 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
1bdd0 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
1bde0 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
1bdf0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1be00 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
1be10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1be20 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
1be30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1be40 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1be50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1be60 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
1be70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1be80 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
1be90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1bea0 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
1beb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bec0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1bed0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1bee0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1bef0 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
1bf00 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1bf10 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1bf20 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1bf30 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1bf40 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1bf50 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1bf60 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1bf70 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1bf80 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1bf90 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1bfa0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1bfb0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1bfc0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1bfd0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1bfe0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1bff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c000 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1c010 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1c020 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1c030 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1c040 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
1c050 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c060 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
1c070 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
1c080 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1c090 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
1c0a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1c0b0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1c0c0 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d  ight, cEndAff)!=
1c0d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
1c0e0 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69 74         && !sqlit
1c0f0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1c100 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1c110 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20  ht, cEndAff).   
1c120 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
1c130 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1c140 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
1c150 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66  nEq, 1, &cEndAff
1c160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c170 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1c180 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c190 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1c1a0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1c1b0 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  L );.    }.    s
1c1c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c1d0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20 20   zStartAff);..  
1c1e0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1c1f0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1c200 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1c210 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1c220 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
1c230 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
1c240 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
1c250 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1c260 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1c270 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
1c280 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
1c290 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
1c2a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c2b0 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
1c2c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c2d0 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
1c2e0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1c2f0 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
1c300 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1c310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c320 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1c330 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1c340 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1c350 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
1c360 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1c370 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
1c380 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
1c390 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c3a0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1c3b0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
1c3c0 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
1c3d0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
1c3e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
1c3f0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
1c400 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
1c410 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
1c420 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
1c430 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
1c440 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
1c450 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
1c460 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1c470 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
1c480 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e  estcase( pLoop->
1c490 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c4a0 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  BTM_LIMIT );.   
1c4b0 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70   testcase( pLoop
1c4c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1c4d0 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
1c4e0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1c4f0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1c500 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1c510 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 0a  TOP_LIMIT))!=0 .
1c520 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64       && (j = pId
1c530 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
1c540 29 3e 3d 30 20 0a 20 20 20 20 20 26 26 20 70 49  )>=0 .     && pI
1c550 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
1c560 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 0a  [j].notNull==0 .
1c570 20 20 20 20 20 26 26 20 28 6e 45 71 20 7c 7c 20       && (nEq || 
1c580 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1c590 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1c5a0 54 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  T)==0).    ){.  
1c5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c5c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1c5d0 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
1c5e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1c5f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
1c600 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  ", pIdx->pTable-
1c610 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 29  >aCol[j].zName))
1c620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c630 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c640 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
1c650 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
1c660 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c670 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c680 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
1c690 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
1c6a0 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
1c6b0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
1c6c0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1c6d0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
1c6e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1c6f0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
1c700 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b  if( omitTable ){
1c710 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69  .      /* pIdx i
1c720 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1c730 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  ex.  No need to 
1c740 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20  access the main 
1c750 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65  table. */.    }e
1c760 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1c770 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29  (pIdx->pTable) )
1c780 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1c790 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
1c7a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1c7b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1c7c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c7d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
1c7e0 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
1c7f0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1c800 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c810 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1c820 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1c830 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1c840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c850 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
1c860 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
1c870 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
1c880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c890 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
1c8a0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1c8b0 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  dex(pIdx->pTable
1c8c0 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  );.      iRowidR
1c8d0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1c8e0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1c8f0 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
1c900 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1c910 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1c920 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
1c930 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1c940 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d  Index(pIdx, pPk-
1c950 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20  >aiColumn[j]);. 
1c960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c970 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1c980 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
1c990 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b  k, iRowidReg+j);
1c9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1c9b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c9c0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1c9d0 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f  nd, iCur, addrCo
1c9e0 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ca00 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e  RowidReg, pPk->n
1ca10 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a  KeyCol);.    }..
1ca20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
1ca30 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
1ca40 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
1ca50 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
1ca60 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
1ca70 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
1ca80 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
1ca90 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
1caa0 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
1cab0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1cac0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
1cad0 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  W ){.      pLeve
1cae0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
1caf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
1cb00 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  Rev ){.      pLe
1cb10 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
1cb20 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
1cb30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1cb40 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   OP_Next;.    }.
1cb50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1cb60 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66   iIdxCur;.    if
1cb70 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1cb80 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1cb90 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AINT)==0 ){.    
1cba0 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
1cbb0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
1cbc0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
1cbd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cbe0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1cbf0 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  >p5==0 );.    }.
1cc00 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1cc10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
1cc20 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
1cc30 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1cc40 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1cc50 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  OR ){.    /* Cas
1cc60 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72  e 5:  Two or mor
1cc70 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64  e separately ind
1cc80 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1cc90 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a  cted by OR.    *
1cca0 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1ccb0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ccc0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1ccd0 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
1cce0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1ccf0 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
1cd00 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1cd10 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29  NDEX i2 ON t1(b)
1cd20 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1cd30 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
1cd40 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (c);.    **.    
1cd50 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1cd60 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
1cd70 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20  OR b=7 OR (c=11 
1cd80 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a  AND d=13).    **
1cd90 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65  .    ** In the e
1cda0 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72  xample, there ar
1cdb0 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20  e three indexed 
1cdc0 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
1cdd0 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68  by OR..    ** Th
1cde0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1cdf0 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  p looks like thi
1ce00 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1ce10 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1ce20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1ce30 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1ce40 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1ce50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1ce60 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e  hen, for each in
1ce70 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20  dexed term, the 
1ce80 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61  following. The a
1ce90 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
1cea0 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72  ** RowSetTest ar
1ceb0 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  e such that the 
1cec0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72  rowid of the cur
1ced0 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65  rent row is inse
1cee0 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  rted.    ** into
1cef0 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20   the RowSet. If 
1cf00 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
1cf10 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73  esent, control s
1cf20 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  kips the.    ** 
1cf30 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64  Gosub opcode and
1cf40 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20   jumps straight 
1cf50 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
1cf60 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e  rated by WhereEn
1cf70 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d()..    **.    
1cf80 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1cf90 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72  3WhereBegin(<ter
1cfa0 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  m>).    **      
1cfb0 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20      RowSetTest  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69  # Insert rowid i
1cfe0 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a  nto rowset.    *
1cff0 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  *          Gosub
1d000 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a        2 A.    **
1d010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1d020 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a  hereEnd().    **
1d030 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e  .    ** Followin
1d040 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64  g the above, cod
1d050 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  e to terminate t
1d060 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41  he loop. Label A
1d070 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  , the target.   
1d080 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62   ** of the Gosub
1d090 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f   above, jumps to
1d0a0 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1d0b0 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
1d0c0 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   Goto..    **.  
1d0d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1d0e0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1d0f0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1d100 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1d110 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  eg 1.    **     
1d120 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20       Goto       
1d130 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
1d140 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66   # The loop is f
1d150 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a  inished..    **.
1d160 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20      **       A: 
1d170 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20  <loop body>     
1d180 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65              # Re
1d190 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65  turn data, whate
1d1a0 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ver..    **.    
1d1b0 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75  **          Retu
1d1c0 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20  rn     2        
1d1d0 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62          # Jump b
1d1e0 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62  ack to the Gosub
1d1f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d200 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74       B: <after t
1d210 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a  he loop>.    **.
1d220 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65      */.    Where
1d230 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
1d240 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
1d250 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
1d260 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
1d270 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54     SrcList *pOrT
1d280 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f  ab;       /* Sho
1d290 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73  rtened table lis
1d2a0 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67  t or OR-clause g
1d2b0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
1d2c0 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30   Index *pCov = 0
1d2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d2e0 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72   Potential cover
1d2f0 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55  ing index (or NU
1d300 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  LL) */.    int i
1d310 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d  CovCur = pParse-
1d320 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72  >nTab++;  /* Cur
1d330 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64  sor used for ind
1d340 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79  ex scans (if any
1d350 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  ) */..    int re
1d360 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
1d370 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
1d380 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d390 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
1d3a0 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
1d3b0 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d3e0 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
1d3f0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
1d400 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1d430 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
1d440 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
1d450 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
1d460 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
1d470 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
1d480 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
1d490 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1d4c0 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
1d4d0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
1d4e0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d500 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
1d510 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
1d520 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d550 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1d560 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20   Expr *pAndExpr 
1d570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d580 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e      /* An ".. AN
1d590 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  D (...)" express
1d5a0 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70  ion */.   .    p
1d5b0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1d5c0 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
1d5d0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1d5e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1d5f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d600 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
1d610 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
1d620 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
1d630 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
1d640 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
1d650 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1d660 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1d670 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65  _Return;.    pLe
1d680 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74  vel->p1 = regRet
1d690 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  urn;..    /* Set
1d6a0 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73   up a new SrcLis
1d6b0 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74  t in pOrTab cont
1d6c0 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1d6d0 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20   being scanned. 
1d6e0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f     ** by this lo
1d6f0 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73  op in the a[0] s
1d700 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52  lot and all notR
1d710 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61  eady tables in a
1d720 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20  [1..] slots..   
1d730 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73   ** This becomes
1d740 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20   the SrcList in 
1d750 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
1d760 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
1d770 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a  reBegin()..    *
1d780 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  /.    if( pWInfo
1d790 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20  ->nLevel>1 ){.  
1d7a0 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64      int nNotRead
1d7b0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1d7c0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1d7d0 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62   of notReady tab
1d7e0 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  les */.      str
1d7f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d800 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f   *origSrc;     /
1d810 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  * Original list 
1d820 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  of tables */.   
1d830 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70     nNotReady = p
1d840 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20  WInfo->nLevel - 
1d850 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
1d860 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74    pOrTab = sqlit
1d870 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
1d880 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8a0 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
1d8b0 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
1d8c0 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
1d8d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
1d8e0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
1d8f0 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
1d900 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
1d910 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  (u8)(nNotReady +
1d920 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
1d930 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
1d940 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
1d950 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
1d960 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
1d970 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
1d980 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
1d990 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d9a0 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
1d9b0 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
1d9c0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1d9d0 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
1d9e0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
1d9f0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
1da00 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
1da10 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
1da20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1da30 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
1da40 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
1da50 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
1da60 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
1da70 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
1da80 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
1da90 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
1daa0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
1dab0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
1dac0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
1dad0 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
1dae0 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
1daf0 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
1db00 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
1db10 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
1db20 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1db30 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
1db40 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
1db50 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
1db60 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
1db70 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
1db80 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
1db90 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
1dba0 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
1dbb0 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
1dbc0 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
1dbd0 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
1dbe0 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
1dbf0 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
1dc00 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
1dc10 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
1dc20 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
1dc30 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
1dc40 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1dc50 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1dc60 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
1dc70 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
1dc80 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
1dc90 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
1dca0 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
1dcb0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1dcc0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1dcd0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
1dce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
1dcf0 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
1dd00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
1dd10 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
1dd20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1dd30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dd40 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1dd50 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
1dd60 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
1dd70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1dd80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1dd90 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
1dda0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1ddb0 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ddc0 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
1ddd0 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
1dde0 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
1ddf0 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
1de00 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
1de10 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
1de20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
1de30 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
1de40 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
1de50 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
1de60 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
1de70 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
1de80 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
1de90 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
1dea0 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
1deb0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1dec0 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  () below..    **
1ded0 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  .    ** Actually
1dee0 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  , each subexpres
1def0 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65  sion is converte
1df00 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20  d to "xN AND w" 
1df10 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a  where w is.    *
1df20 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69  * the "interesti
1df30 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d  ng" terms of z -
1df40 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20   terms that did 
1df50 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
1df60 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f   the.    ** ON o
1df70 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
1df80 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
1df90 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  nd terms that ar
1dfa0 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20  e usable as .   
1dfb0 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20   ** indices..   
1dfc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1dfd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73  optimization als
1dfe0 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69  o only applies i
1dff0 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20  f the (x1 OR x2 
1e000 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20  OR ...) term.   
1e010 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61   ** is not conta
1e020 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63  ined in the ON c
1e030 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
1e040 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65  JOIN..    ** See
1e050 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77   ticket http://w
1e060 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
1e070 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65  c/info/f2369304e
1e080 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  4.    */.    if(
1e090 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b   pWC->nTerm>1 ){
1e0a0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
1e0b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
1e0c0 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e  m=0; iTerm<pWC->
1e0d0 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
1e0e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1e0f0 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54  Expr = pWC->a[iT
1e100 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  erm].pExpr;.    
1e110 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b      if( &pWC->a[
1e120 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20  iTerm] == pTerm 
1e130 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e140 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1e150 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e160 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
1e170 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e180 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  if( pWC->a[iTerm
1e190 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ].wtFlags & (TER
1e1a0 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
1e1b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e1c0 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
1e1d0 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
1e1e0 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
1e1f0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
1e200 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
1e210 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
1e220 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
1e230 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1e240 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72  And(db, pAndExpr
1e250 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1e260 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
1e270 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1e280 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
1e290 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1e2a0 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
1e2b0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
1e2c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
1e2d0 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
1e2e0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
1e2f0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e300 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
1e310 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
1e320 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1e330 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
1e340 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1e350 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
1e360 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
1e370 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
1e380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1e390 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
1e3a0 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
1e3b0 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
1e3c0 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
1e3d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1e3e0 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
1e3f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
1e400 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
1e410 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
1e420 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
1e430 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
1e440 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
1e450 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
1e460 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
1e470 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
1e480 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
1e490 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
1e4a0 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
1e4b0 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
1e4c0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1e4d0 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
1e4e0 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
1e510 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
1e520 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
1e550 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
1e560 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
1e570 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
1e580 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
1e590 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1e5a0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e5b0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1e5c0 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
1e5d0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1e5e0 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a  Loop *pSubLoop;.
1e5f0 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
1e600 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
1e610 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1e620 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
1e630 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
1e640 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
1e650 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
1e660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1e670 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e680 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1e690 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1e6a0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1e6b0 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57  Set = ((ii==pOrW
1e6c0 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69  c->nTerm-1)?-1:i
1e6d0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
1e6e0 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
1e6f0 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
1e700 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1e710 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
1e720 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  ->pTab, -1, iCur
1e730 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
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 20 72 65 67 52              regR
1e760 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
1e770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e780 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1e790 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
1e7a0 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Rowset,.        
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e7d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e7e0 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a  v)+2, r, iSet);.
1e7f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e810 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1e820 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20  sub, regReturn, 
1e830 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
1e840 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53         /* The pS
1e850 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
1e860 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e  dTerms flag mean
1e870 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74  s that this OR t
1e880 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
1e890 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f   contained one o
1e8a0 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20  r more AND term 
1e8b0 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20  from a notReady 
1e8c0 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20  table.  The.    
1e8d0 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66        ** terms f
1e8e0 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79  rom the notReady
1e8f0 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74   table could not
1e900 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77   be tested and w
1e910 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ill.          **
1e920 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74   need to be test
1e930 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20  ed later..      
1e940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1e950 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e   if( pSubWInfo->
1e960 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
1e970 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
1e980 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  1;..          /*
1e990 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f   If all of the O
1e9a0 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
1e9b0 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20  s are optimized 
1e9c0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
1e9d0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65           ** inde
1e9e0 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  x, and the index
1e9f0 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
1ea00 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72   the same cursor
1ea10 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
1ea20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c    ** by each cal
1ea30 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1ea40 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79  eBegin() made by
1ea50 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d   this loop, it m
1ea60 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
1ea70 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
1ea80 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73  se that index as
1ea90 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1eaa0 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  x..          **.
1eab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
1eac0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
1ead0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1eae0 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69  above resulted i
1eaf0 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20  n a scan that.  
1eb00 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20          ** uses 
1eb10 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  an index, and th
1eb20 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65  is is either the
1eb30 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63   first OR-connec
1eb40 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20  ted term.       
1eb50 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
1eb60 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  or the index is 
1eb70 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74  the same as that
1eb80 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65   used by all pre
1eb90 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
1eba0 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43  ** terms, set pC
1ebb0 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64  ov to the candid
1ebc0 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
1ebd0 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ex. Otherwise, s
1ebe0 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  et .          **
1ebf0 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f   pCov to NULL to
1ec00 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e   indicate that n
1ec10 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  o candidate cove
1ec20 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20  ring index will 
1ec30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
1ec40 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20   available..    
1ec50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ec60 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53     pSubLoop = pS
1ec70 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57  ubWInfo->a[0].pW
1ec80 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
1ec90 61 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f  assert( (pSubLoo
1eca0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ecb0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d  RE_AUTO_INDEX)==
1ecc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
1ecd0 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  f( (pSubLoop->ws
1ece0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1ecf0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
1ed00 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c       && (ii==0 |
1ed10 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  | pSubLoop->u.bt
1ed20 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76  ree.pIndex==pCov
1ed30 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
1ed40 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1ed50 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  t( pSubWInfo->a[
1ed60 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76  0].iIdxCur==iCov
1ed70 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Cur );.         
1ed80 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f     pCov = pSubLo
1ed90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1eda0 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ex;.          }e
1edb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1edc0 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20   pCov = 0;.     
1edd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ede0 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
1edf0 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
1ee00 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
1ee10 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
1ee20 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
1ee30 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1ee40 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
1ee50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ee60 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1ee70 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f  >u.pCovidx = pCo
1ee80 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20  v;.    if( pCov 
1ee90 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ) pLevel->iIdxCu
1eea0 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20  r = iCovCur;.   
1eeb0 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
1eec0 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d  .      pAndExpr-
1eed0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  >pLeft = 0;.    
1eee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1eef0 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72  ete(db, pAndExpr
1ef00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1ef10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
1ef20 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
1ef30 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ef40 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
1ef50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ef60 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
1ef70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
1ef80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ef90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1efa0 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
1efb0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
1efc0 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
1efd0 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72  tackFree(db, pOr
1efe0 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
1eff0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
1f000 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1f010 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
1f020 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1f030 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
1f040 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
1f050 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20  .    /* Case 6: 
1f060 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
1f070 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
1f080 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
1f090 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1f0a0 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
1f0b0 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
1f0c0 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
1f0d0 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
1f0e0 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
1f0f0 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
1f100 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
1f110 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
1f120 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
1f130 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
1f140 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
1f150 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
1f160 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  ->isRecursive ){
1f170 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73  .      /* Tables
1f180 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73   marked isRecurs
1f190 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  ive have only a 
1f1a0 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20  single row that 
1f1b0 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20  is stored in.   
1f1c0 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63     ** a pseudo-c
1f1d0 75 72 73 6f 72 2e 20 20 4e 65 65 64 20 6e 65 65  ursor.  Need nee
1f1e0 64 20 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e  d to Rewind or N
1f1f0 65 78 74 20 73 75 63 68 20 63 75 72 73 6f 72 73  ext such cursors
1f200 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65  . */.      pLeve
1f210 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
1f220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f230 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
1f240 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
1f250 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1f260 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
1f270 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
1f280 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f290 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
1f2a0 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
1f2b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
1f2c0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
1f2d0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
1f2e0 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  P;.    }.  }..  
1f2f0 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
1f300 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
1f310 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1f320 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
1f330 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  y.  ** computed 
1f340 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
1f350 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
1f360 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
1f370 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
1f380 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
1f390 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
1f3a0 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65  Expr *pE;.    te
1f3b0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1f3c0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1f3d0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73  RTUAL );.    tes
1f3e0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1f3f0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1f400 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ED );.    if( pT
1f410 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
1f420 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
1f430 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
1f440 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
1f450 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
1f460 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
1f470 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
1f480 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
1f490 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
1f4a0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1f4b0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1f4c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1f4d0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
1f4e0 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
1f4f0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
1f500 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
1f510 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1f520 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
1f530 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1f540 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
1f550 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1f560 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
1f570 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
1f580 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1f590 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1f5a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f5b0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1f5c0 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
1f5d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1f5e0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
1f5f0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
1f600 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  D;.  }..  /* Ins
1f610 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
1f620 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e   for implied con
1f630 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f  straints based o
1f640 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20  n transitivity. 
1f650 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20   ** of the "==" 
1f660 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
1f670 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20   ** Example: If 
1f680 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1f690 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d   contains "t1.a=
1f6a0 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d  t2.b" and "t2.b=
1f6b0 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65  123".  ** and we
1f6c0 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20   are coding the 
1f6d0 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  t1 loop and the 
1f6e0 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20  t2 loop has not 
1f6f0 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20  yet coded,.  ** 
1f700 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75  then we cannot u
1f710 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e  se the "t1.a=t2.
1f720 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62  b" constraint, b
1f730 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20  ut we can code. 
1f740 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20   ** the implied 
1f750 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74  "t1.a=123" const
1f760 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
1f770 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
1f780 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
1f790 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
1f7a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20  {.    Expr *pE, 
1f7b0 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72  *pEAlt;.    Wher
1f7c0 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20  eTerm *pAlt;.   
1f7d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
1f7e0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
1f7f0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
1f800 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f810 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1f820 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c  ator!=(WO_EQUIV|
1f830 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75  WO_EQ) ) continu
1f840 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
1f850 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1f860 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
1f870 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
1f880 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69  LeftJoin ) conti
1f890 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54  nue;.    pE = pT
1f8a0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
1f8b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f8c0 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1f8d0 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20  FromJoin) );.   
1f8e0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
1f8f0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
1f900 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
1f910 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20  !=0 );.    pAlt 
1f920 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1f930 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  iCur, pTerm->u.l
1f940 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65  eftColumn, notRe
1f950 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
1f960 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41  , 0);.    if( pA
1f970 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  lt==0 ) continue
1f980 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e  ;.    if( pAlt->
1f990 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
1f9a0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
1f9b0 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
1f9c0 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
1f9d0 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
1f9e0 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
1f9f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1fa00 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64  N );.    VdbeMod
1fa10 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
1fa20 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65  begin transitive
1fa30 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a   constraint"));.
1fa40 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69      pEAlt = sqli
1fa50 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77  te3StackAllocRaw
1fa60 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41  (db, sizeof(*pEA
1fa70 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45  lt));.    if( pE
1fa80 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  Alt ){.      *pE
1fa90 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78  Alt = *pAlt->pEx
1faa0 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d  pr;.      pEAlt-
1fab0 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65  >pLeft = pE->pLe
1fac0 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ft;.      sqlite
1fad0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1fae0 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72  rse, pEAlt, addr
1faf0 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
1fb00 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1fb10 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
1fb20 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20  (db, pEAlt);.   
1fb30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72   }.  }..  /* For
1fb40 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
1fb50 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
1fb60 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
1fb70 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1fb80 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  .  ** at least o
1fb90 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
1fba0 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
1fbb0 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
1fbc0 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  able.  .  */.  i
1fbd0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
1fbe0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76  Join ){.    pLev
1fbf0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20  el->addrFirst = 
1fc00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1fc10 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
1fc20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fc30 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1fc40 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
1fc50 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
1fc60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f  omment((v, "reco
1fc70 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74  rd LEFT JOIN hit
1fc80 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
1fc90 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1fca0 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28  Parse);.    for(
1fcb0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
1fcc0 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; j<pWC->nTerm;
1fcd0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
1fce0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fcf0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1fd00 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1fd10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fd20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1fd30 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
1fd40 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1fd50 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
1fd60 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
1fd70 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
1fd80 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
1fd90 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
1fda0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
1fdb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
1fdc0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75  ssert( pWInfo->u
1fdd0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a  ntestedTerms );.
1fde0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1fdf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fe00 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
1fe10 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71  Expr );.      sq
1fe20 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1fe30 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
1fe40 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c  pExpr, addrCont,
1fe50 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1fe60 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  LL);.      pTerm
1fe70 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
1fe80 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
1fe90 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1fea0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1feb0 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  e, iReleaseReg);
1fec0 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65  ..  return pLeve
1fed0 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a  l->notReady;.}..
1fee0 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
1fef0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 20  ETRACE_ENABLED) 
1ff00 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1ff10 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1ff20 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1ff30 65 72 61 74 65 20 22 45 78 70 6c 61 6e 61 74 69  erate "Explanati
1ff40 6f 6e 22 20 74 65 78 74 20 66 6f 72 20 61 20 57  on" text for a W
1ff50 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61  hereTerm..*/.sta
1ff60 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 45 78  tic void whereEx
1ff70 70 6c 61 69 6e 54 65 72 6d 28 56 64 62 65 20 2a  plainTerm(Vdbe *
1ff80 76 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  v, WhereTerm *pT
1ff90 65 72 6d 29 7b 0a 20 20 63 68 61 72 20 7a 54 79  erm){.  char zTy
1ffa0 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  pe[4];.  memcpy(
1ffb0 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29  zType, "...", 4)
1ffc0 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77  ;.  if( pTerm->w
1ffd0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1ffe0 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d  RTUAL ) zType[0]
1fff0 20 3d 20 27 56 27 3b 0a 20 20 69 66 28 20 70 54   = 'V';.  if( pT
20000 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
20010 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
20020 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 69  pe[1] = 'E';.  i
20030 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
20040 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
20050 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
20060 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
20070 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
20080 50 72 69 6e 74 66 28 76 2c 20 22 25 73 20 22 2c  Printf(v, "%s ",
20090 20 7a 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74   zType);.  sqlit
200a0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 76 2c  e3ExplainExpr(v,
200b0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
200c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57 48 45 52  }.#endif /* WHER
200d0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 26  ETRACE_ENABLED &
200e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
200f0 54 52 45 45 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  TREE_EXPLAIN */.
20100 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
20110 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
20120 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
20130 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
20140 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
20150 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
20160 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
20170 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
20180 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
20190 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
201a0 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
201b0 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
201c0 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
201d0 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
201e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
201f0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
20200 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
20210 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
20220 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
20230 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
20240 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
20250 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
20260 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
20290 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
202a0 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
202b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
202c0 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
202f0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
20300 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
20310 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
20320 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
20330 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
20340 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
20350 6d 65 3b 0a 20 20 20 20 20 69 66 28 20 70 2d 3e  me;.     if( p->
20360 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26  u.btree.pIndex &
20370 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e  & (zName = p->u.
20380 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
20390 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
203a0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
203b0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
203c0 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20  index_", 17)==0 
203d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
203e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
203f0 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20  30(zName) - 1;. 
20400 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e         while( zN
20410 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d  ame[i]!='_' ) i-
20420 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  -;.        zName
20430 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
20440 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
20450 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20  gPrintf(".%-16s 
20460 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e  %2d", zName, p->
20470 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20  u.btree.nEq);.  
20480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
20490 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
204a0 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20  f("%20s","");.  
204b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
204c0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66   char *z;.    if
204d0 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  ( p->u.vtab.idxS
204e0 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  tr ){.      z = 
204f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20500 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22  "(%d,\"%s\",%x)"
20510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20520 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e    p->u.vtab.idxN
20530 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  um, p->u.vtab.id
20540 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xStr, p->u.vtab.
20550 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
20560 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
20570 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20580 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e  "(%d,%x)", p->u.
20590 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
205a0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
205b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
205c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
205d0 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20   %-19s", z);.   
205e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
205f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
20600 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
20610 30 34 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  04x N %d", p->ws
20620 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
20630 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
20640 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25  gPrintf(" cost %
20650 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72  d,%d,%d\n", p->r
20660 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20  Setup, p->rRun, 
20670 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 64 65 66  p->nOut);.#ifdef
20680 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54   SQLITE_ENABLE_T
20690 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  REE_EXPLAIN.  /*
206a0 20 49 66 20 74 68 65 20 30 78 31 30 30 20 62 69   If the 0x100 bi
206b0 74 20 6f 66 20 77 68 65 72 65 74 72 61 63 69 6e  t of wheretracin
206c0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 73  g is set, then s
206d0 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  how all of the c
206e0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 65  onstraint.  ** e
206f0 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
20700 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61 4c 54 65  e WhereLoop.aLTe
20710 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20 20 2a 2f  rm[] array..  */
20720 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d  .  if( p->nLTerm
20730 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72   && (sqlite3Wher
20740 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21  eTrace & 0x100)!
20750 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45 52 45 54  =0 ){  /* WHERET
20760 52 41 43 45 20 30 78 31 30 30 20 2a 2f 0a 20 20  RACE 0x100 */.  
20770 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
20780 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  e *v = pWInfo->p
20790 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
207a0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
207b0 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f  Begin(v);.    fo
207c0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65  r(i=0; i<p->nLTe
207d0 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
207e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
207f0 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b   = p->aLTerm[i];
20800 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
20810 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
20820 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20830 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 20  lainPrintf(v, " 
20840 20 28 25 64 29 20 23 25 2d 32 64 20 22 2c 20 69   (%d) #%-2d ", i
20850 2b 31 2c 20 28 69 6e 74 29 28 70 54 65 72 6d 2d  +1, (int)(pTerm-
20860 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20 20  pWC->a));.      
20870 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
20880 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65  sh(v);.      whe
20890 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c  reExplainTerm(v,
208a0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 73   pTerm);.      s
208b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
208c0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
208d0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a  e3ExplainNL(v);.
208e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
208f0 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76  3ExplainFinish(v
20900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
20910 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
20920 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
20930 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a  nation(v));.  }.
20940 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a  #endif.}.#endif.
20950 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
20960 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
20970 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
20980 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
20990 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
209a0 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
209b0 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
209c0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
209d0 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
209e0 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
209f0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
20a00 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
20a10 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
20a20 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
20a30 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
20a40 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
20a50 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
20a60 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
20a70 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
20a80 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
20a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20aa0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
20ab0 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
20ac0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
20ad0 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
20ae0 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
20af0 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55  ALTABLE|WHERE_AU
20b00 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  TO_INDEX) ){.   
20b10 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
20b20 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
20b30 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
20b40 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
20b50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20b60 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
20b70 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
20b80 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
20b90 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
20ba0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
20bb0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
20bc0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
20bd0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
20be0 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
20bf0 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
20c00 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
20c10 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
20c20 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
20c30 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
20c40 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d  3KeyInfoUnref(p-
20c50 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
20c60 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
20c70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20c80 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
20c90 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
20ca0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
20cb0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
20cc0 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
20cd0 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
20ce0 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
20cf0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
20d00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
20d10 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
20d20 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
20d30 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
20d40 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
20d50 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
20d60 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
20d70 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
20d80 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
20d90 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
20da0 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
20db0 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
20dc0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
20dd0 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
20de0 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
20df0 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
20e00 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
20e10 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
20e20 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
20e30 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
20e40 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
20e50 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
20e60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20e70 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
20e80 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
20e90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20ea0 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  w(db, sizeof(p->
20eb0 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20  aLTerm[0])*n);. 
20ec0 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20   if( paNew==0 ) 
20ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20ee0 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  MEM;.  memcpy(pa
20ef0 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
20f00 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
20f10 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
20f20 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
20f30 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
20f40 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
20f50 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
20f60 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
20f70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
20f80 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
20f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20fa0 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
20fb0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
20fc0 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
20fd0 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
20fe0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
20ff0 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
21000 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
21010 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
21020 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
21030 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
21040 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
21050 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
21060 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
21070 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
21080 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
21090 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
210a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
210b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
210c0 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
210d0 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
210e0 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
210f0 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
21100 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
21110 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
21120 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
21130 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
21140 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
21150 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
21160 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
21170 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
21180 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
21190 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
211a0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
211b0 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
211c0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
211d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
211e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
211f0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
21200 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
21210 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
21220 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
21230 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
21240 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
21250 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
21260 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
21270 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
21280 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
21290 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
212a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
212b0 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
212c0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
212d0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
212e0 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
212f0 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
21300 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
21310 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
21320 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
21330 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
21340 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
21350 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
21360 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
21370 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
21380 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
21390 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
213a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
213b0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
213c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
213d0 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
213e0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
213f0 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
21400 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
21410 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
21420 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
21430 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
21440 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
21450 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
21460 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
21470 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
21480 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
21490 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
214a0 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
214b0 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
214c0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
214d0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
214e0 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
214f0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
21500 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
21510 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
21520 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
21530 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
21540 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
21550 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
21560 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
21570 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
21580 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
21590 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
215a0 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
215b0 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
215c0 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
215d0 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
215e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
215f0 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
21600 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
21610 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
21620 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
21630 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
21640 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
21650 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
21660 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
21670 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
21680 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
21690 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
216a0 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
216b0 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
216c0 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
216d0 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
216e0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
216f0 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  * template is be
21700 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
21710 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
21720 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
21730 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
21740 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
21750 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
21760 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
21770 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
21780 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
21790 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
217a0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
217b0 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
217c0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
217d0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
217e0 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
217f0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
21800 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
21810 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
21820 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
21830 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65 6d      (5)  The tem
21840 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20  plate uses more 
21850 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d  terms of the sam
21860 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73 20  e index but has 
21870 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  no additional.**
21880 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64 65           depende
21890 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20 0a  ncies          .
218a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
218b0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
218c0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
218d0 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
218e0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
218f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
21900 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78  pPrev, *p, *pNex
21910 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e  t = 0;.  WhereIn
21920 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
21930 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
21940 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
21950 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
21960 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
21970 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
21980 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
21990 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
219a0 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
219b0 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
219c0 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
219d0 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23  ->pOrSet!=0 ){.#
219e0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
219f0 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20  ABLED.    u16 n 
21a00 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
21a10 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78  et->n;.    int x
21a20 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68   =.#endif.    wh
21a30 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69  ereOrInsert(pBui
21a40 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54  lder->pOrSet, pT
21a50 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c  emplate->prereq,
21a60 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
21a70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
21aa0 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52  >nOut);.#if WHER
21ab0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
21ac0 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28  * 0x8 */.    if(
21ad0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
21ae0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
21af0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21b00 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64  intf(x?"   or-%d
21b10 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20  :  ":"   or-X:  
21b20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65  ", n);.      whe
21b30 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
21b40 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
21b50 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
21b60 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
21b70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
21b80 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
21b90 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
21ba0 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74  Loop to overwrit
21bb0 65 2c 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65  e, or which take
21bc0 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20  s.  ** priority 
21bd0 6f 76 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a  over pTemplate..
21be0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65    */.  for(ppPre
21bf0 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  v=&pWInfo->pLoop
21c00 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b  s, p=*ppPrev; p;
21c10 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
21c20 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
21c30 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
21c40 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
21c50 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
21c60 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
21c70 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
21c80 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
21c90 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
21ca0 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
21cb0 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
21cc0 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
21cd0 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
21ce0 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
21cf0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
21d00 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
21d10 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
21d20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
21d30 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
21d40 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
21d50 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
21d60 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
21d70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
21d80 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
21d90 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
21da0 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
21db0 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
21dc0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
21dd0 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
21de0 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
21df0 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
21e00 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
21e10 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
21e20 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
21e30 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
21e40 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
21e60 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
21e70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
21e80 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
21e90 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
21ea0 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
21eb0 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
21ec0 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
21ed0 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
21ee0 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
21ef0 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
21f00 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
21f10 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
21f20 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
21f30 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
21f40 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
21f50 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
21f60 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
21f70 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  );..    if( (p->
21f80 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
21f90 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e  te->prereq)==p->
21fa0 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70  prereq.     && p
21fb0 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c  ->rSetup<=pTempl
21fc0 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20  ate->rSetup.    
21fd0 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
21fe0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20  mplate->rRun.   
21ff0 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
22000 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20  emplate->nOut.  
22010 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
22020 69 73 20 62 72 61 6e 63 68 20 74 61 6b 65 6e 20  is branch taken 
22030 77 68 65 6e 20 70 20 69 73 20 65 71 75 61 6c 20  when p is equal 
22040 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  or better than p
22050 54 65 6d 70 6c 61 74 65 20 69 6e 20 0a 20 20 20  Template in .   
22060 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 28 31 29     ** all of (1)
22070 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 28 32   dependencies (2
22080 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33  ) setup-cost, (3
22090 29 20 72 75 6e 2d 63 6f 73 74 2c 20 61 6e 64 0a  ) run-cost, and.
220a0 20 20 20 20 20 20 2a 2a 20 28 34 29 20 6e 75 6d        ** (4) num
220b0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
220c0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ws. */.      ass
220d0 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
220e0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
220f0 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  p );.      if( p
22100 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c  ->prereq==pTempl
22110 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
22120 20 20 20 26 26 20 70 2d 3e 6e 4c 54 65 72 6d 3c     && p->nLTerm<
22130 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
22140 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e  m.       && (p->
22150 77 73 46 6c 61 67 73 20 26 20 70 54 65 6d 70 6c  wsFlags & pTempl
22160 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
22170 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
22180 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 75  .       && (p->u
22190 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70  .btree.pIndex==p
221a0 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65  Template->u.btre
221b0 65 2e 70 49 6e 64 65 78 0a 20 20 20 20 20 20 20  e.pIndex.       
221c0 20 20 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d     || pTemplate-
221d0 3e 72 52 75 6e 2b 70 2d 3e 6e 4c 54 65 72 6d 3c  >rRun+p->nLTerm<
221e0 3d 70 2d 3e 72 52 75 6e 2b 70 54 65 6d 70 6c 61  =p->rRun+pTempla
221f0 74 65 2d 3e 6e 4c 54 65 72 6d 29 0a 20 20 20 20  te->nLTerm).    
22200 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
22210 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
22220 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
22230 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20  with an similar 
22240 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20  one that uses.  
22250 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65        ** more te
22260 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
22270 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
22280 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
22290 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
222a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
222b0 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61        /* pTempla
222c0 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  te is not helpfu
222d0 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  l..        ** Re
222e0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61  turn without cha
222f0 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20  nging or adding 
22300 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  anything */.    
22310 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
22320 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20  opInsert_noop;. 
22330 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22340 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
22350 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
22360 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
22370 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20  >prereq.     && 
22380 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61  p->rRun>=pTempla
22390 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26  te->rRun.     &&
223a0 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
223b0 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b  ate->nOut.    ){
223c0 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  .      /* Overwr
223d0 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
223e0 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
223f0 20 62 65 74 74 65 72 20 6f 6e 65 3a 20 6f 6e 65   better one: one
22400 20 74 68 61 74 20 69 73 0a 20 20 20 20 20 20 2a   that is.      *
22410 2a 20 62 65 74 74 65 72 20 61 74 20 6f 6e 65 20  * better at one 
22420 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63  of (1) dependenc
22430 69 65 73 2c 20 28 32 29 20 73 65 74 75 70 2d 63  ies, (2) setup-c
22440 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73  ost, (3) run-cos
22450 74 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 28 34  t.      ** or (4
22460 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  ) number of outp
22470 75 74 20 72 6f 77 73 2c 20 61 6e 64 20 69 73 20  ut rows, and is 
22480 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20  no worse in any 
22490 6f 66 20 74 68 6f 73 65 0a 20 20 20 20 20 20 2a  of those.      *
224a0 2a 20 63 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f  * categories. */
224b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
224c0 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
224d0 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f  ate->rSetup ); /
224e0 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  * SETUP-INVARIAN
224f0 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20  T above */.     
22500 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
22510 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 62 72 65  tLoop;.      bre
22520 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
22530 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
22540 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
22550 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
22560 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
22570 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
22580 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
22590 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
225a0 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
225b0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
225c0 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
225d0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
225e0 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
225f0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
22600 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
22610 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
22620 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
22630 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
22640 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22650 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20  ins-del:  ");.  
22660 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
22670 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
22680 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pWC);.    }.    
22690 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
226a0 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29  tf("ins-new:  ")
226b0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
226c0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
226d0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
226e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
226f0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d   p==0 ){.    p =
22700 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22710 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  Raw(db, sizeof(W
22720 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
22730 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
22740 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22750 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69      whereLoopIni
22760 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72  t(p);.  }.  wher
22770 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c  eLoopXfer(db, p,
22780 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70   pTemplate);.  p
22790 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e  ->pNextLoop = pN
227a0 65 78 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d  ext;.  *ppPrev =
227b0 20 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73   p;.  if( (p->ws
227c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
227d0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
227e0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
227f0 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
22800 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
22810 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
22820 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
22830 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
22840 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
22850 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
22860 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
22870 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
22880 69 6e 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f  insert is a no-o
22890 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e  p */.whereLoopIn
228a0 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57  sert_noop:.#if W
228b0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
228c0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
228d0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
228e0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
228f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22900 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22  ntf("ins-noop: "
22910 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
22920 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
22930 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
22940 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
22950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
22960 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73   .}../*.** Adjus
22970 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  t the WhereLoop.
22980 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77  nOut value downw
22990 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ard to account f
229a0 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  or terms of the.
229b0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
229c0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
229d0 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63  he loop but whic
229e0 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62  h are not used b
229f0 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  y an.** index..*
22a00 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72  *.** In the curr
22a10 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
22a20 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20 65 78  on, the first ex
22a30 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  tra WHERE clause
22a40 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a   term reduces.**
22a50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
22a60 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 61 20  utput rows by a 
22a70 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61 6e 64  factor of 10 and
22a80 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
22a90 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73   term.** reduces
22aa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
22ab0 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 73 71  utput rows by sq
22ac0 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt(2)..*/.static
22ad0 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f   void whereLoopO
22ae0 75 74 70 75 74 41 64 6a 75 73 74 28 57 68 65 72  utputAdjust(Wher
22af0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 57 68  eClause *pWC, Wh
22b00 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b  ereLoop *pLoop){
22b10 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
22b20 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
22b30 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
22b40 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
22b50 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
22b60 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  );.  int i, j;..
22b70 20 20 69 66 28 20 21 4f 70 74 69 6d 69 7a 61 74    if( !Optimizat
22b80 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 43 2d 3e  ionEnabled(pWC->
22b90 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
22ba0 64 62 2c 20 53 51 4c 49 54 45 5f 41 64 6a 75 73  db, SQLITE_Adjus
22bb0 74 4f 75 74 45 73 74 29 20 29 7b 0a 20 20 20 20  tOutEst) ){.    
22bc0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
22bd0 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
22be0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
22bf0 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
22c00 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
22c10 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
22c20 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
22c30 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
22c40 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
22c50 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
22c60 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
22c70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
22c80 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
22c90 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
22ca0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
22cb0 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
22cc0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
22cd0 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
22ce0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
22cf0 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
22d00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
22d10 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
22d20 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
22d30 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
22d40 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
22d50 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
22d60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
22d70 20 20 20 69 66 28 20 6a 3c 30 20 29 20 70 4c 6f     if( j<0 ) pLo
22d80 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
22d90 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
22da0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  }.}../*.** We ha
22db0 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
22dc0 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
22dd0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
22de0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
22df0 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20   pIndex..** Try 
22e00 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
22e10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  e..**.** If pPro
22e20 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
22e30 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
22e40 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
22e50 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
22e60 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
22e70 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
22e80 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
22e90 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
22ea0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
22eb0 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
22ec0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
22ed0 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
22ee0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
22ef0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
22f00 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
22f10 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
22f20 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
22f50 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
22f60 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
22f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
22f80 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
22f90 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
22fa0 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
22fb0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
22fc0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
22fd0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
22fe0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
22ff0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
23000 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
23010 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
23020 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
23030 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23040 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
23050 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
23060 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
23070 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
23080 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
23090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
230a0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
230b0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
230c0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
230d0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
230e0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
230f0 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
23100 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
23110 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23130 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
23140 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
23150 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
23160 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
23170 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
23180 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
23190 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
231a0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
231b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
231c0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
231d0 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
231e0 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23200 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
23210 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
23220 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
23230 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
23240 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
23250 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
23260 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
23270 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
23280 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
23290 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
232a0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
232b0 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20  tree.nSkip */.  
232c0 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
232d0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
232e0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
232f0 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
23300 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
23310 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
23320 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
23330 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
23340 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
23350 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23370 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
23380 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
23390 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
233a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
233b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
233c0 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
233d0 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   nRowEst;       
233e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
233f0 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c  imated index sel
23400 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 4c 6f  ectivity */.  Lo
23410 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23430 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
23440 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
23450 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
23460 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
23470 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
23480 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
23490 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
234a0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
234b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
234c0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
234d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
234e0 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
234f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
23500 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
23510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
23520 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
23530 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
23540 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
23550 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23560 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
23570 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
23580 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
23590 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
235a0 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f  <=0 || (pSrc->jo
235b0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
235c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
235d0 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
235e0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
235f0 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
23600 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
23610 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
23620 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47  SNULL|WO_GT|WO_G
23630 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
23640 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
23650 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
23660 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
23670 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
23680 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
23690 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
236a0 3c 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  <=pProbe->nKeyCo
236b0 6c 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  l );.  if( pNew-
236c0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70  >u.btree.nEq < p
236d0 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Probe->nKeyCol )
236e0 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72  {.    iCol = pPr
236f0 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
23700 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
23710 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20  ;.    nRowEst = 
23720 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 50  sqlite3LogEst(pP
23730 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70  robe->aiRowEst[p
23740 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
23750 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  +1]);.    if( nR
23760 6f 77 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f  owEst==0 && pPro
23770 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  be->onError==OE_
23780 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d  None ) nRowEst =
23790 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
237a0 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
237b0 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d  nRowEst = 0;.  }
237c0 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
237d0 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
237e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
237f0 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43  Src->iCursor, iC
23800 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
23810 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61              opMa
23820 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73  sk, pProbe);.  s
23830 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d  aved_nEq = pNew-
23840 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
23850 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e  saved_nSkip = pN
23860 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
23870 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72  p;.  saved_nLTer
23880 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  m = pNew->nLTerm
23890 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67  ;.  saved_wsFlag
238a0 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  s = pNew->wsFlag
238b0 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65  s;.  saved_prere
238c0 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  q = pNew->prereq
238d0 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d  ;.  saved_nOut =
238e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70   pNew->nOut;.  p
238f0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
23900 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
23910 74 4c 6f 67 28 73 71 6c 69 74 65 33 4c 6f 67 45  tLog(sqlite3LogE
23920 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  st(pProbe->aiRow
23930 45 73 74 5b 30 5d 29 29 3b 0a 0a 20 20 2f 2a 20  Est[0]));..  /* 
23940 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
23950 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
23960 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
23970 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
23980 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
23990 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
239a0 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
239b0 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
239c0 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
239d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
239e0 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
239f0 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
23a00 6c 65 61 73 74 20 31 38 2e 20 20 54 68 65 20 6d  least 18.  The m
23a10 61 67 69 63 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  agic.  ** number
23a20 20 31 38 20 77 61 73 20 66 6f 75 6e 64 20 62 79   18 was found by
23a30 20 65 78 70 65 72 69 6d 65 6e 74 61 74 69 6f 6e   experimentation
23a40 20 74 6f 20 62 65 20 74 68 65 20 70 61 79 6f 66   to be the payof
23a50 66 20 70 6f 69 6e 74 20 77 68 65 72 65 0a 20 20  f point where.  
23a60 2a 2a 20 73 6b 69 70 2d 73 63 61 6e 20 62 65 63  ** skip-scan bec
23a70 6f 6d 65 20 66 61 73 74 65 72 20 74 68 61 6e 20  ome faster than 
23a80 61 20 66 75 6c 6c 2d 73 63 61 6e 2e 0a 20 20 2a  a full-scan..  *
23a90 2f 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  /.  if( pTerm==0
23aa0 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71  .   && saved_nEq
23ab0 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20  ==saved_nSkip.  
23ac0 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c   && saved_nEq+1<
23ad0 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a  pProbe->nKeyCol.
23ae0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
23af0 52 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  RowEst[saved_nEq
23b00 2b 31 5d 3e 3d 31 38 20 20 2f 2a 20 54 55 4e 49  +1]>=18  /* TUNI
23b10 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20  NG: Minimum for 
23b20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20  skip-scan */.   
23b30 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f  && (rc = whereLo
23b40 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
23b50 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
23b60 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  1))==SQLITE_OK. 
23b70 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e   ){.    LogEst n
23b80 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Iter;.    pNew->
23b90 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
23ba0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
23bb0 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e  .nSkip++;.    pN
23bc0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
23bd0 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a  >nLTerm++] = 0;.
23be0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
23bf0 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53  s |= WHERE_SKIPS
23c00 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d  CAN;.    nIter =
23c10 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
23c20 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
23c30 30 5d 2f 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  0]/pProbe->aiRow
23c40 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
23c50 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
23c60 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
23c70 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
23c80 72 6f 62 65 2c 20 6e 49 74 65 72 29 3b 0a 20 20  robe, nIter);.  
23c90 7d 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  }.  for(; rc==SQ
23ca0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
23cb0 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65  !=0; pTerm = whe
23cc0 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
23cd0 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20  )){.    int nIn 
23ce0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
23cf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
23d00 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
23d10 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
23d20 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
23d30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
23d40 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
23d50 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  or==WO_ISNULL ||
23d60 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
23d70 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
23d80 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30  .     && (iCol<0
23d90 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e   || pSrc->pTab->
23da0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
23db0 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ll).    ){.     
23dc0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
23dd0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
23de0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
23df0 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
23e00 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
23e10 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
23e20 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
23e30 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
23e40 75 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ue;..    assert(
23e50 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
23e60 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20  ed_nOut );..    
23e70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
23e80 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
23e90 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
23ea0 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
23eb0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
23ec0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
23ed0 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
23ee0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
23ef0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
23f00 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
23f10 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
23f20 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
23f30 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
23f40 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
23f50 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
23f60 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
23f70 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
23f80 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
23f90 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f  pNew->rRun = rLo
23fa0 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69  gSize; /* Baseli
23fb0 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28  ne cost is log2(
23fc0 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73  N).  Adjustments
23fd0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66   below */.    if
23fe0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
23ff0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
24000 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
24010 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
24020 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
24030 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
24040 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
24050 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
24060 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
24070 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
24080 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
24090 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
240a0 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
240b0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
240c0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
240d0 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
240e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
240f0 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
24100 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
24110 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
24120 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
24130 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
24140 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
24150 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
24160 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
24170 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
24180 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
24190 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
241a0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
241b0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77   nIn;.      pNew
241c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
241d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
241e0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
241f0 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
24200 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
24210 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
24220 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73  _EQ) ){.      as
24230 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 28 70  sert(.        (p
24240 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
24250 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
24260 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  L|WHERE_COLUMN_I
24270 4e 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  N|WHERE_SKIPSCAN
24280 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c  ))!=0.        ||
24290 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
242a0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
242b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
242c0 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
242d0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20    if( iCol<0  . 
242e0 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65        || (pProbe
242f0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
24300 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a  ne && nInMul==0.
24310 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e             && pN
24320 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
24330 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
24340 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
24350 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e       assert( (pN
24360 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
24370 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
24380 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20  0 || iCol<0 );. 
24390 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
243a0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
243b0 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EROW;.      }.  
243c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
243d0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70  e.nEq++;.      p
243e0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
243f0 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20  Est + nInMul;.  
24400 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
24410 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
24420 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20  WO_ISNULL) ){.  
24430 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
24440 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
24450 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e  N_NULL;.      pN
24460 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
24470 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  +;.      /* TUNI
24480 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65  NG: IS NULL sele
24490 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20  cts 2 rows */.  
244a0 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61      nIn = 10;  a
244b0 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
244c0 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
244d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
244e0 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d  = nRowEst + nInM
244f0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65  ul + nIn;.    }e
24500 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
24510 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
24520 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
24530 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24540 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24550 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_GT );.      te
24560 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
24570 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
24580 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
24590 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
245a0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
245b0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
245c0 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72       pBtm = pTer
245d0 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  m;.      pTop = 
245e0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
245f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
24600 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
24610 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
24620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24630 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24640 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
24650 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24660 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24670 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_LE );.      pN
24680 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
24690 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
246a0 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  E|WHERE_TOP_LIMI
246b0 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  T;.      pTop = 
246c0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74  pTerm;.      pBt
246d0 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  m = (pNew->wsFla
246e0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
246f0 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20  IMIT)!=0 ?.     
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
24720 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30  w->nLTerm-2] : 0
24730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24740 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
24750 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
24760 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  GE ){.      /* A
24770 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72  djust nOut and r
24780 52 75 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61  Run for STAT3 ra
24790 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  nge values */.  
247a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
247b0 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
247c0 75 74 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ut );.      wher
247d0 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
247e0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
247f0 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
24800 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
24810 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
24820 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
24830 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a   if( nInMul==0 .
24840 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
24850 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 26 26  nSample .     &&
24860 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
24870 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
24880 70 6c 65 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f  pleCol.     && O
24890 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
248a0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  ed(db, SQLITE_St
248b0 61 74 33 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  at3) .    ){.   
248c0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
248d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
248e0 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75       tRowcnt nOu
248f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
24900 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
24910 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
24920 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  SNULL))!=0 ){.  
24930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24940 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24950 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
24960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24970 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
24980 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
24990 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
249a0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
249b0 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
249c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
249d0 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
249e0 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
249f0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
24a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
24a10 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72    !ExprHasProper
24a20 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
24a30 53 65 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20  Select)  ){.    
24a40 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
24a50 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
24a60 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
24a70 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
24a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24a90 61 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20  assert( nOut==0 
24aa0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
24ab0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
24ac0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ut ){.        pN
24ad0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
24ae0 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a  e3LogEst(nOut);.
24af0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
24b00 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
24b10 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
24b20 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
24b30 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
24b40 66 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  f.    if( (pNew-
24b50 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
24b60 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
24b70 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
24b80 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77 20 69     /* Each row i
24b90 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70 20 6f  nvolves a step o
24ba0 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65  f the index, the
24bb0 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  n a binary searc
24bc0 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  h of.      ** th
24bd0 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a  e main table */.
24be0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
24bf0 20 3d 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73   =  sqlite3LogEs
24c00 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
24c10 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72 4c  rLogSize>27 ? rL
24c20 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30 29 3b  ogSize-17 : 10);
24c30 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53 74  .    }.    /* St
24c40 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61 63 68  ep cost for each
24c50 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a 20   output row */. 
24c60 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
24c70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
24c80 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
24c90 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 77 68  w->nOut);.    wh
24ca0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
24cb0 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
24cc0 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 63  C, pNew);.    rc
24cd0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
24ce0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
24cf0 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  w);.    if( (pNe
24d00 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
24d10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
24d20 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
24d30 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f  .btree.nEq<(pPro
24d40 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 2b 20 28 70  be->nKeyCol + (p
24d50 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29  Probe->zName!=0)
24d60 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77  ).    ){.      w
24d70 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
24d80 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
24d90 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
24da0 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d  nMul+nIn);.    }
24db0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
24dc0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69  = saved_nOut;.#i
24dd0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
24de0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
24df0 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  4.    pBuilder->
24e00 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
24e10 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
24e20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  }.  pNew->prereq
24e30 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b   = saved_prereq;
24e40 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
24e50 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
24e60 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  ;.  pNew->u.btre
24e70 65 2e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  e.nSkip = saved_
24e80 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77  nSkip;.  pNew->w
24e90 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
24ea0 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  sFlags;.  pNew->
24eb0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
24ec0 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  t;.  pNew->nLTer
24ed0 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
24ee0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24ef0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
24f00 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
24f10 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
24f20 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
24f30 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
24f40 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
24f50 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
24f60 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
24f70 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
24f80 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
24f90 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
24fa0 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
24fb0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
24fc0 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
24fd0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
24fe0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
24ff0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
25000 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25010 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
25020 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
25030 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
25040 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
25050 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
25060 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
25070 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69  prList *pOB;.  i
25080 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
25090 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
250a0 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
250b0 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
250c0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
250d0 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
250e0 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
250f0 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
25100 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
25110 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
25120 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
25130 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ate(pOB->a[ii].p
25140 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
25150 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
25160 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
25170 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
25180 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
25190 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  {.      for(jj=0
251a0 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
251b0 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
251c0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
251d0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
251e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20  >aiColumn[jj] ) 
251f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
25200 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
25210 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
25220 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73   Return a bitmas
25230 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63  k where 1s indic
25240 61 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72  ate that the cor
25250 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
25260 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  n of.** the tabl
25270 65 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20  e is used by an 
25280 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
25290 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
252a0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
252b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
252c0 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64  ask columnsInInd
252d0 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  ex(Index *pIdx){
252e0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30  .  Bitmask m = 0
252f0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
25300 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (j=pIdx->nColumn
25310 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
25320 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
25330 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
25340 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
25350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
25360 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
25370 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
25380 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  S-2 );.      if(
25390 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
253a0 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20  MASKBIT(x);.    
253b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
253c0 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
253d0 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61   see if a partia
253e0 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61  l index with pPa
253f0 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e  rtIndexWhere can
25400 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74   be used.** in t
25410 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
25420 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
25430 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20  f it can be and 
25440 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
25450 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
25460 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
25470 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68  dex(int iTab, Wh
25480 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
25490 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
254a0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
254b0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f  erm *pTerm;.  fo
254c0 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
254d0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
254e0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
254f0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
25500 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
25510 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70  (pTerm->pExpr, p
25520 57 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72  Where, iTab) ) r
25530 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
25540 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
25550 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
25560 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
25570 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
25580 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65  f the join where
25590 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73   the table.** is
255a0 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75   idenfied by pBu
255b0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
255c0 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
255d0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
255e0 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74  be.** a b-tree t
255f0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74  able, not a virt
25600 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
25610 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25620 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
25630 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
25640 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
25650 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
25660 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
25670 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
25680 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
25690 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
256a0 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
256b0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
256c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
256d0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
256e0 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
256f0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
25700 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
25710 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
25720 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
25730 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25750 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
25760 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
25770 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
25780 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73   tRowcnt aiRowEs
25790 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20  tPk[2];      /* 
257a0 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76  The aiRowEst[] v
257b0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
257c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
257d0 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
257e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
257f0 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
25800 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
25810 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
25820 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
25830 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
25840 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
25850 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25860 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
25870 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
25880 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
25890 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
258a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
258b0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
258c0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
258d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
258e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
258f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
25900 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
25910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
25920 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
25930 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
25940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
25950 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
25960 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25980 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
25990 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
259a0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
259b0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
259c0 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
259d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
259e0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
259f0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
25a00 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
25a10 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
25a20 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
25a30 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
25a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25a50 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
25a60 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
25a70 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
25a80 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
25a90 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
25aa0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
25ab0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
25ac0 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
25ad0 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
25ae0 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
25af0 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
25b00 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
25b10 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
25b20 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
25b30 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
25b40 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
25b50 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
25b60 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
25b70 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
25b80 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
25b90 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
25ba0 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ndex;.  }else if
25bb0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
25bc0 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20  ) ){.    pProbe 
25bd0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
25be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25bf0 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
25c00 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
25c10 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
25c20 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
25c30 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
25c40 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
25c50 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
25c60 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
25c70 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
25c80 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
25c90 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
25ca0 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
25cb0 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
25cc0 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
25cd0 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
25ce0 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
25cf0 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
25d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
25d10 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
25d20 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
25d30 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
25d40 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
25d50 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
25d60 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  KeyCol = 1;.    
25d70 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26  sPk.aiColumn = &
25d80 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20  aiColumnPk;.    
25d90 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61  sPk.aiRowEst = a
25da0 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73  iRowEstPk;.    s
25db0 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  Pk.onError = OE_
25dc0 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b  Replace;.    sPk
25dd0 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  .pTable = pTab;.
25de0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
25df0 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73  ] = pTab->nRowEs
25e00 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
25e10 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46  k[1] = 1;.    pF
25e20 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
25e30 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
25e40 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
25e50 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
25e60 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
25e70 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
25e80 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
25e90 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
25ea0 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
25eb0 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
25ec0 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
25ed0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
25ee0 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
25ef0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
25f00 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
25f10 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 73  .  }.  rSize = s
25f20 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 54 61  qlite3LogEst(pTa
25f30 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72  b->nRowEst);.  r
25f40 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
25f50 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65  (rSize);..#ifnde
25f60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25f70 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
25f80 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
25f90 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
25fa0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a  Builder->pOrSet.
25fb0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70     && (pWInfo->p
25fc0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
25fd0 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
25fe0 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53  dex)!=0.   && pS
25ff0 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  rc->pIndex==0.  
26000 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f   && !pSrc->viaCo
26010 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70  routine.   && !p
26020 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a  Src->notIndexed.
26030 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
26040 54 61 62 29 0a 20 20 20 26 26 20 21 70 53 72 63  Tab).   && !pSrc
26050 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20  ->isCorrelated. 
26060 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65    && !pSrc->isRe
26070 63 75 72 73 69 76 65 0a 20 20 29 7b 0a 20 20 20  cursive.  ){.   
26080 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
26090 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
260a0 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ps */.    WhereT
260b0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
260c0 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
260d0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
260e0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
260f0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
26100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26110 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
26120 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
26130 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
26140 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
26150 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
26160 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
26170 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
26180 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
26190 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
261a0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
261b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
261c0 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b  btree.nSkip = 0;
261d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
261e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
261f0 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
26200 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
26210 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
26220 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
26230 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
26240 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66   One-time cost f
26250 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65  or computing the
26260 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
26270 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   is.        ** a
26280 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e  pproximately 7*N
26290 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
262a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
262b0 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
262c0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
262d0 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f  eing indexed. */
262e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
262f0 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
26300 20 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20   + rSize + 28;  
26310 61 73 73 65 72 74 28 20 32 38 3d 3d 73 71 6c 69  assert( 28==sqli
26320 74 65 33 4c 6f 67 45 73 74 28 37 29 20 29 3b 0a  te3LogEst(7) );.
26330 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
26340 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
26350 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
26360 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
26370 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
26380 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
26390 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
263a0 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
263b0 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
263c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
263d0 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c 65  nowning how sele
263e0 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
263f0 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
26400 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20  be.  It would.  
26410 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20        ** not be 
26420 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20  unreasonable to 
26430 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20  make this value 
26440 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a  much larger. */.
26450 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
26460 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74  ut = 43;  assert
26470 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 43==sqlite3Log
26480 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20  Est(20) );.     
26490 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
264a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
264b0 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e  (rLogSize,pNew->
264c0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70  nOut);.        p
264d0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
264e0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
264f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
26500 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c  rereq = mExtra |
26510 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
26520 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
26530 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
26540 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
26550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26560 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
26570 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
26580 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
26590 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
265a0 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
265b0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
265c0 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
265d0 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
265e0 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
265f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
26600 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
26610 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
26620 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
26630 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54 61 62 2c  ndex(pNew->iTab,
26640 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50   pWC, pProbe->pP
26650 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a  artIdxWhere) ){.
26660 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
26670 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65   /* Partial inde
26680 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20  x inappropriate 
26690 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a  for this query *
266a0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  /.    }.    pNew
266b0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
266c0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  0;.    pNew->u.b
266d0 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a  tree.nSkip = 0;.
266e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
266f0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
26700 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
26710 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
26720 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72   0;.    pNew->pr
26730 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
26740 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
26750 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d  rSize;.    pNew-
26760 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26770 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20  = pProbe;.    b 
26780 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  = indexMightHelp
26790 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69  WithOrderBy(pBui
267a0 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53  lder, pProbe, pS
267b0 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
267c0 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53    /* The ONEPASS
267d0 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e  _DESIRED flags n
267e0 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65  ever occurs toge
267f0 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20  ther with ORDER 
26800 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  BY */.    assert
26810 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
26820 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
26830 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
26840 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20  0 || b==0 );.   
26850 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75   if( pProbe->tnu
26860 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  m<=0 ){.      /*
26870 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   Integer primary
26880 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20   key index */.  
26890 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
268a0 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a  s = WHERE_IPK;..
268b0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61        /* Full ta
268c0 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ble scan */.    
268d0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
268e0 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
268f0 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  : 0;.      /* TU
26900 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75  NING: Cost of fu
26910 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73  ll table scan is
26920 20 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29   3*(N + log2(N))
26930 2e 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54  ..      **  +  T
26940 68 65 20 65 78 74 72 61 20 33 20 66 61 63 74 6f  he extra 3 facto
26950 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67  r is to encourag
26960 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  e the use of ind
26970 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20  exed lookups.   
26980 20 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66     **     over f
26990 75 6c 6c 20 73 63 61 6e 73 2e 20 20 46 49 58 4d  ull scans.  FIXM
269a0 45 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  E */.      pNew-
269b0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
269c0 6f 67 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72  ogEstAdd(rSize,r
269d0 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20  LogSize) + 16;. 
269e0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
269f0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
26a00 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 63 20  pNew);.      rc 
26a10 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
26a20 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
26a30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
26a40 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
26a50 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
26a60 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
26a70 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20      Bitmask m;. 
26a80 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d       if( pProbe-
26a90 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20  >isCovering ){. 
26aa0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
26ab0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58  lags = WHERE_IDX
26ac0 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e  _ONLY | WHERE_IN
26ad0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d  DEXED;.        m
26ae0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26af0 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70  e{.        m = p
26b00 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  Src->colUsed & ~
26b10 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
26b20 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20  Probe);.        
26b30 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
26b40 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
26b50 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
26b60 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
26b70 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d  INDEXED;.      }
26b80 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
26b90 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
26ba0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20  /.      if( b.  
26bb0 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
26bc0 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c  d(pTab).       |
26bd0 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
26be0 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
26bf0 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
26c00 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e      && (pProbe->
26c10 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
26c20 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20  zTabRow).       
26c30 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
26c40 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26c50 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
26c60 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
26c70 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
26c80 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
26c90 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
26ca0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
26cb0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
26cc0 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
26cd0 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
26ce0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
26cf0 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
26d00 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
26d10 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   : 0;.        if
26d20 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
26d30 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
26d40 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e  ost of a coverin
26d50 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20  g index scan is 
26d60 4b 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  K*(N + log2(N)).
26d70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b  .          **  +
26d80 20 20 54 68 65 20 65 78 74 72 61 20 66 61 63 74    The extra fact
26d90 6f 72 20 4b 20 6f 66 20 62 65 74 77 65 65 6e 20  or K of between 
26da0 31 2e 31 20 61 6e 64 20 33 2e 30 20 74 68 61 74  1.1 and 3.0 that
26db0 20 64 65 70 65 6e 64 73 0a 20 20 20 20 20 20 20   depends.       
26dc0 20 20 20 2a 2a 20 20 20 20 20 6f 6e 20 74 68 65     **     on the
26dd0 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
26de0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
26df0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4b 0a 20   the index.  K. 
26e00 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
26e10 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 73  is smaller for s
26e20 6d 61 6c 6c 65 72 20 69 6e 64 69 63 65 73 2c 20  maller indices, 
26e30 74 68 75 73 20 66 61 76 6f 72 69 6e 67 20 74 68  thus favoring th
26e40 65 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  em..          */
26e50 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
26e60 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
26e70 6f 67 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72  ogEstAdd(rSize,r
26e80 4c 6f 67 53 69 7a 65 29 20 2b 20 31 20 2b 0a 20  LogSize) + 1 +. 
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 20 20 20 20 20 28 31 35 2a 70 50 72 6f 62         (15*pProb
26eb0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
26ec0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
26ed0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26ee0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
26ef0 20 43 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e   Cost of scannin
26f00 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  g a non-covering
26f10 20 69 6e 64 65 78 20 69 73 20 28 4e 2b 31 29 2a   index is (N+1)*
26f20 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20  log2(N).        
26f30 20 20 2a 2a 20 77 68 69 63 68 20 77 65 20 77 69    ** which we wi
26f40 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a  ll simplify to j
26f50 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f  ust N*log2(N) */
26f60 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
26f70 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
26f80 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  rLogSize;.      
26f90 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 65 72    }.        wher
26fa0 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
26fb0 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20  t(pWC, pNew);.  
26fc0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
26fd0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
26fe0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
26ff0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
27000 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
27010 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
27020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
27030 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
27040 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
27050 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
27060 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
27070 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27080 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
27090 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
270a0 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
270b0 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
270c0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
270d0 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
270e0 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
270f0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
27100 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
27110 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
27120 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
27130 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
27140 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
27150 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
27160 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
27170 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27180 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
27190 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
271a0 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
271b0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
271c0 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
271d0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
271e0 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
271f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
27200 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
27210 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
27220 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
27230 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
27240 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
27250 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
27260 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
27270 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
27280 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
27290 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
272a0 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65   mExtra.){.  Whe
272b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
272c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
272d0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
272e0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
272f0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
27300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
27310 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
27320 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
27330 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
27340 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
27350 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
27360 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
27370 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
27380 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
27390 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
273a0 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
273b0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
273c0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
273d0 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
273e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
273f0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
27400 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
27410 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
27420 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
27430 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
27440 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
27450 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
27460 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
27470 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
27480 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
274a0 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
274b0 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
274c0 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
274d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
274e0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
274f0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
27500 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
27510 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
27540 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
27550 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
27560 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
27570 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
27580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57  SQLITE_OK;..  pW
27590 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
275a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
275b0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
275c0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
275d0 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
275e0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
275f0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
27600 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
27610 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
27620 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
27630 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
27640 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
27650 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
27660 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
27670 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
27680 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
27690 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
276a0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
276b0 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72   pIdxInfo==0 ) r
276c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
276d0 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  EM;.  pNew->prer
276e0 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
276f0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
27700 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
27710 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
27720 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
27730 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
27740 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
27750 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
27760 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
27770 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
27780 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
27790 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
277a0 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
277b0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
277c0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
277d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
277e0 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
277f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27800 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
27810 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
27820 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
27830 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
27840 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
27850 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
27860 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
27870 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
27880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27890 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
278a0 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
278b0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
278c0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
278d0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
278e0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
278f0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
27900 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
27910 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
27920 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
27930 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
27940 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
27950 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
27960 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
27970 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
27980 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
27990 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
279a0 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
279b0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
279c0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
279d0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
279e0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
279f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27a00 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
27a10 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
27a20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27a30 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
27a40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
27a50 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
27a60 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
27a70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
27a80 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
27a90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
27aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27ab0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
27ac0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
27ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
27ae0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
27af0 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 1:    /* Cons
27b00 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70  tants with IN op
27b10 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
27b20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
27b30 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
27b40 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
27b50 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
27b60 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20  eqRight==0);.   
27b70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27b80 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
27b90 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
27ba0 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
27bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
27bc0 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
27bd0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
27be0 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
27bf0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
27c00 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
27c10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
27c20 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
27c30 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
27c40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27c50 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
27c60 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
27c70 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
27c80 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
27c90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27ca0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
27cb0 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
27cc0 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
27cd0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
27ce0 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
27cf0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
27d00 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
27d10 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
27d20 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
27d30 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
27d40 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
27d50 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
27d60 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
27d70 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
27d80 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
27d90 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
27da0 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
27db0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
27dc0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
27dd0 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
27de0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
27df0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
27e00 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62  5;.    rc = vtab
27e10 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
27e20 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
27e30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27e40 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
27e50 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
27e60 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
27e70 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
27e80 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
27e90 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
27ea0 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  raint;.    pNew-
27eb0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
27ec0 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
27ed0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
27ee0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
27ef0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
27f00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
27f10 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
27f20 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
27f30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
27f40 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
27f50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27f60 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
27f70 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
27f80 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
27f90 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
27fa0 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
27fb0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
27fc0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
27fd0 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
27fe0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
27ff0 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
28000 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
28010 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
28020 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
28030 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
28040 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
28050 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28060 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
28070 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
28080 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
28090 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
280a0 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
280b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
280c0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
280d0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
280e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
280f0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
28100 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
28110 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
28120 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
28130 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
28140 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
28150 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
28160 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
28170 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
28180 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
28190 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
281a0 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
281b0 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
281c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
281d0 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
281e0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
281f0 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
28200 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
28210 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28220 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
28230 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
28240 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
28250 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
28260 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
28270 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
28280 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
28290 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
282a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
282b0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
282c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
282d0 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
282e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
282f0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
28300 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
28310 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
28320 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
28330 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
28340 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
28350 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
28360 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
28370 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
28380 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
28390 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
283a0 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
283b0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
283c0 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
283d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
283e0 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
283f0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
28400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28420 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
28430 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
28440 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
28450 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
28460 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
28470 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
28480 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
28490 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
284a0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
284b0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
284c0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
284d0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
284e0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
284f0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
28500 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
28510 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
28520 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
28530 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
28540 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
28550 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
28560 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
28570 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
28580 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28590 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
285a0 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
285b0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
285c0 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
285d0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
285e0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
285f0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
28600 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
28610 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
28620 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
28630 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
28640 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
28650 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
28660 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
28670 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
28680 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
28690 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
286a0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
286b0 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
286c0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
286d0 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28  Ordered = (u8)((
286e0 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
286f0 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  By!=0).         
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
28720 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
28730 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20  Consumed);.     
28740 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
28750 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
28760 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
28770 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  EstFromDouble(pI
28780 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
28790 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e  dCost);.      pN
287a0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
287b0 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66  e3LogEst(pIdxInf
287c0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
287d0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
287e0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
287f0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
28800 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
28810 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
28820 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28830 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
28840 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
28850 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
28860 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
28870 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
28880 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
28890 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
288a0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
288b0 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
288c0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
288d0 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
288e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
288f0 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
28900 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
28910 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
28920 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
28930 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
28940 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
28950 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
28960 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
28970 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
28980 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
28990 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
289a0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
289b0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
289c0 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
289d0 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
289e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
289f0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
28a00 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
28a10 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
28a20 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
28a30 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
28a40 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
28a50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28a60 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
28a70 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
28a80 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
28a90 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
28aa0 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
28ab0 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20  , sCur, sPrev;. 
28ac0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28ad0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
28ae0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
28af0 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49  ->pWC;.  if( pWI
28b00 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
28b10 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  & WHERE_AND_ONLY
28b20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28b30 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  _OK;.  pWCEnd = 
28b40 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
28b50 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
28b60 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
28b70 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c  memset(&sSum, 0,
28b80 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a   sizeof(sSum));.
28b90 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
28ba0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
28bb0 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 66  pNew->iTab;.  if
28bc0 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65  ( !HasRowid(pIte
28bd0 6d 2d 3e 70 54 61 62 29 20 29 20 72 65 74 75 72  m->pTab) ) retur
28be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
28bf0 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
28c00 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65  rsor;..  for(pTe
28c10 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
28c20 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53  <pWCEnd && rc==S
28c30 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b  QLITE_OK; pTerm+
28c40 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
28c50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28c60 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26  WO_OR)!=0.     &
28c70 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
28c80 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
28c90 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29   pNew->maskSelf)
28ca0 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
28cb0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
28cc0 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
28cd0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
28ce0 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
28cf0 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
28d00 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
28d10 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
28d20 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
28d30 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
28d40 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
28d50 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
28d60 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75     .      sSubBu
28d70 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b  ild = *pBuilder;
28d80 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
28d90 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
28da0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
28db0 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a  OrSet = &sCur;..
28dc0 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
28dd0 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
28de0 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
28df0 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
28e00 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
28e10 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
28e20 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
28e30 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
28e40 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
28e50 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
28e60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28e70 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
28e80 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
28e90 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57         tempWC.pW
28ea0 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
28eb0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  fo;.          te
28ec0 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
28ed0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
28ee0 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
28ef0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
28f00 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
28f10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
28f20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
28f30 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
28f40 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20  WC = &tempWC;.  
28f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28f60 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
28f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28f80 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23     sCur.n = 0;.#
28f90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28fa0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
28fb0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
28fc0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
28fd0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
28fe0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
28ff0 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
29000 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
29010 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
29020 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
29030 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
29040 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
29050 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
29060 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29070 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
29080 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
29090 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
290a0 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
290b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
290c0 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
290d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
290e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
290f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
29100 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
29110 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
29120 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
29130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29140 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
29150 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d  ve(&sPrev, &sSum
29160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  );.          sSu
29170 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
29180 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50     for(i=0; i<sP
29190 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  rev.n; i++){.   
291a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
291b0 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29  ; j<sCur.n; j++)
291c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
291d0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73  whereOrInsert(&s
291e0 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e  Sum, sPrev.a[i].
291f0 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b  prereq | sCur.a[
29200 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20  j].prereq,.     
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
29230 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
29240 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b  i].rRun, sCur.a[
29250 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20  j].rRun),.      
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
29280 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
29290 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
292a0 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
292b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
292c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
292d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
292e0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
292f0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
29300 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
29310 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
29320 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
29330 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
29340 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
29350 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
29360 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
29370 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
29380 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
29390 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
293a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
293b0 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
293c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
293d0 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20  NG: Multiple by 
293e0 33 2e 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f  3.5 for the seco
293f0 6e 64 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b  ndary table look
29400 75 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  up */.        pN
29410 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
29420 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a  a[i].rRun + 18;.
29430 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
29440 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
29450 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
29460 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
29470 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
29480 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29490 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
294a0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
294b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
294c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
294d0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
294e0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
294f0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
29500 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
29510 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
29520 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
29530 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
29540 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
29550 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
29560 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
29570 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  a = 0;.  Bitmask
29580 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
29590 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
295a0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
295b0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
295c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
295d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
295e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
295f0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
29600 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  b;.  int nTabLis
29610 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  t = pWInfo->nLev
29620 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
29630 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70  QLITE_OK;.  u8 p
29640 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30  riorJoinType = 0
29650 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
29660 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  New;..  /* Loop 
29670 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
29680 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
29690 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
296a0 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
296b0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
296c0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
296d0 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
296e0 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
296f0 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73  >a; iTab<nTabLis
29700 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  t; iTab++, pItem
29710 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  ++){.    pNew->i
29720 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
29730 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
29740 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
29750 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65  ->sMaskSet, pIte
29760 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
29770 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f   if( ((pItem->jo
29780 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
29790 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  Type) & (JT_LEFT
297a0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
297b0 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  {.      mExtra =
297c0 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
297d0 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65     priorJoinType
297e0 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   = pItem->jointy
297f0 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
29800 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
29810 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  b) ){.      rc =
29820 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
29830 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
29840 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73  Extra);.    }els
29850 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
29860 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
29870 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
29880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
298a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
298b0 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
298c0 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
298d0 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
298e0 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
298f0 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
29900 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29910 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
29920 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
29930 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
29940 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29950 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
29960 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
29970 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
29980 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
29990 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72  f the 5th.** par
299a0 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
299b0 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
299c0 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
299d0 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
299e0 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
299f0 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
29a00 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
29a10 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
29a20 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a  rn:.** .**    0:
29a30 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f    ORDER BY is no
29a40 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f  t satisfied.  So
29a50 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a  rting required.*
29a60 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42  *    1:  ORDER B
29a70 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 20  Y is satisfied. 
29a80 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e       Omit sortin
29a90 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e  g.**   -1:  Unkn
29aa0 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  own at this time
29ab0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
29ac0 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
29ad0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e  WHERE_GROUPBY an
29ae0 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  d WHERE_DISTINCT
29af0 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20  BY is not as.** 
29b00 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52  strict.  With GR
29b10 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
29b20 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71  NCT the only req
29b30 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74  uirement is that
29b40 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72  .** equivalent r
29b50 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64  ows appear immed
29b60 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20  iately adjacent 
29b70 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20  to one another. 
29b80 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64   GROUP BY.** and
29b90 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20   DISTINT do not 
29ba0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
29bb0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
29bc0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
29bd0 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
29be0 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivelent rows are
29bf0 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
29c00 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
29c10 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
29c20 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
29c30 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
29c40 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
29c50 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
29c60 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
29c70 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
29c80 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
29c90 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
29ca0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
29cb0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
29cc0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
29cd0 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
29ce0 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
29cf0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
29d00 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
29d10 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f  pOrderBy,   /* O
29d20 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
29d30 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
29d40 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20  clause to check 
29d50 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
29d60 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68  pPath,     /* Th
29d70 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63  e WherePath to c
29d80 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63  heck */.  u16 wc
29d90 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
29da0 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e  /* Might contain
29db0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f   WHERE_GROUPBY o
29dc0 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  r WHERE_DISTINCT
29dd0 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  BY */.  u16 nLoo
29de0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
29df0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
29e00 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
29e10 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
29e20 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
29e30 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
29e40 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
29e50 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
29e60 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
29e70 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
29e80 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
29e90 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
29ea0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
29eb0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
29ec0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
29ed0 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
29ee0 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
29ef0 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
29f00 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
29f10 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
29f20 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
29f30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
29f40 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
29f50 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
29f60 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
29f70 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
29f80 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
29f90 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
29fa0 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
29fb0 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
29fc0 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
29fd0 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
29fe0 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
29ff0 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
2a000 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
2a010 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
2a020 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e  lause */.  u16 n
2a030 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
2a040 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
2a050 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
2a060 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
2a070 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
2a080 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2a090 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
2a0a0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
2a0b0 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
2a0c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
2a0d0 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
2a0e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2a0f0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
2a100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a110 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
2a120 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
2a130 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
2a140 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
2a150 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2a160 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2a170 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
2a180 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2a190 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
2a1a0 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
2a1b0 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
2a1c0 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
2a1d0 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
2a1e0 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
2a1f0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
2a200 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
2a210 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
2a220 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
2a230 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2a240 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
2a250 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
2a260 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
2a270 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
2a280 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
2a290 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
2a2a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2a2b0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
2a2c0 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
2a2d0 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
2a2e0 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
2a2f0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
2a300 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
2a310 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2a320 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
2a330 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
2a340 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
2a350 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
2a360 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2a370 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
2a380 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
2a390 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
2a3a0 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
2a3b0 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
2a3c0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
2a3d0 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
2a3e0 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
2a3f0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
2a400 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
2a410 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
2a420 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
2a430 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
2a440 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
2a450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2a460 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
2a470 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
2a480 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
2a490 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
2a4a0 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
2a4b0 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
2a4c0 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
2a4d0 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
2a4e0 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
2a4f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2a500 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2a510 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
2a520 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
2a530 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
2a540 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
2a550 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
2a560 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
2a570 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
2a580 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
2a590 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
2a5a0 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
2a5b0 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
2a5c0 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
2a5d0 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
2a5e0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
2a5f0 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
2a600 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
2a610 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2a620 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
2a630 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
2a640 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
2a650 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
2a660 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
2a670 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2a680 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
2a690 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
2a6a0 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
2a6b0 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
2a6c0 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
2a6d0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
2a6e0 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
2a6f0 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
2a700 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
2a710 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
2a720 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
2a730 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
2a740 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
2a750 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2a760 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
2a770 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
2a780 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
2a790 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
2a7a0 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
2a7b0 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
2a7c0 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
2a7d0 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
2a7e0 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
2a7f0 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
2a800 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
2a810 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
2a820 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2a830 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
2a840 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
2a850 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
2a860 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
2a870 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
2a880 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
2a890 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
2a8a0 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
2a8b0 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
2a8c0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2a8d0 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
2a8e0 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
2a8f0 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
2a900 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
2a910 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
2a920 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
2a930 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61  0 );..  /* Sorta
2a940 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61  bility of virtua
2a950 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74 65  l tables is dete
2a960 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78 42  rmined by the xB
2a970 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a  estIndex method.
2a980 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74    ** of the virt
2a990 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66  ual table itself
2a9a0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d   */.  if( pLast-
2a9b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2a9c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
2a9d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
2a9e0 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72  Loop>0 );  /* Tr
2a9f0 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f  ue when outer lo
2aa00 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20  ops are one-row 
2aa10 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20  and match .     
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa30 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52       ** no ORDER
2aa40 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   BY terms */.   
2aa50 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75   return pLast->u
2aa60 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b  .vtab.isOrdered;
2aa70 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  .  }.  if( nLoop
2aa80 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2aa90 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
2aaa0 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
2aab0 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
2aac0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
2aad0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2aae0 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
2aaf0 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
2ab00 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
2ab10 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
2ab20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
2ab30 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
2ab40 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
2ab50 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2ab60 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
2ab70 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
2ab80 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
2ab90 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
2aba0 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28  eady = 0;.  for(
2abb0 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72  iLoop=0; isOrder
2abc0 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61  Distinct && obSa
2abd0 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f  t<obDone && iLoo
2abe0 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  p<=nLoop; iLoop+
2abf0 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  +){.    if( iLoo
2ac00 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70  p>0 ) ready |= p
2ac10 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2ac20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f      pLoop = iLoo
2ac30 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d  p<nLoop ? pPath-
2ac40 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20  >aLoop[iLoop] : 
2ac50 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pLast;.    asser
2ac60 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
2ac70 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2ac80 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
2ac90 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
2aca0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2acb0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
2acc0 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
2acd0 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
2ace0 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
2acf0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
2ad00 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
2ad10 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
2ad20 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
2ad30 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
2ad40 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
2ad50 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2ad60 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
2ad70 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
2ad80 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
2ad90 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
2ada0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2adb0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2adc0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2add0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2ade0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2adf0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2ae00 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2ae10 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2ae20 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
2ae30 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2ae40 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2ae50 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
2ae60 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
2ae70 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2ae80 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
2ae90 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
2aea0 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
2aeb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45      ~ready, WO_E
2aee0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b  Q|WO_ISNULL, 0);
2aef0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2af00 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2af10 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2af20 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
2af30 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  Q)!=0 && pOBExpr
2af40 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
2af50 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2af60 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
2af70 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2af80 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2af90 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2afa0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2afb0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2afc0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2afd0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2afe0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
2aff0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
2b000 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2b010 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2b020 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2b030 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
2b040 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2b050 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2b060 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2b070 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
2b080 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2b090 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2b0a0 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
2b0b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2b0c0 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20  .      obSat |= 
2b0d0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2b0e0 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  }..    if( (pLoo
2b0f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2b100 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b  RE_ONEROW)==0 ){
2b110 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2b120 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2b130 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  E_IPK ){.       
2b140 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
2b150 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30       nKeyCol = 0
2b160 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
2b170 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
2b180 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
2b190 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2b1a0 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
2b1b0 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2b1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2b1d0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
2b1e0 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  e{.        nKeyC
2b1f0 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  ol = pIndex->nKe
2b200 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43  yCol;.        nC
2b210 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2b220 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
2b230 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
2b240 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21  ==nKeyCol+1 || !
2b250 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
2b260 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20  >pTable) );.    
2b270 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
2b280 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
2b290 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c  lumn-1]==(-1) ||
2b2a0 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
2b2b0 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20  x->pTable));.   
2b2c0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2b2d0 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  inct = pIndex->o
2b2e0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
2b2f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2b300 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2b310 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
2b320 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
2b330 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
2b340 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
2b350 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
2b360 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
2b370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2b380 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
2b390 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2b3a0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
2b3b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
2b3c0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
2b3d0 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f     u8 bOnce;   /
2b3e0 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68  * True to run th
2b3f0 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63  e ORDER BY searc
2b400 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20  h loop */..     
2b410 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
2b420 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74  == and IS NULL t
2b430 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  erms */.        
2b440 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  if( j<pLoop->u.b
2b450 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
2b460 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
2b470 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20  ree.nSkip==0.   
2b480 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
2b490 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
2b4a0 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
2b4b0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
2b4c0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
2b4d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
2b4e0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
2b4f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b500 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2b510 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
2b520 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2b530 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2b540 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
2b550 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
2b560 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2b570 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
2b580 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
2b590 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
2b5a0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
2b5b0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
2b5c0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
2b5d0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
2b5e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2b5f0 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
2b600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
2b610 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
2b620 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
2b630 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
2b640 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
2b650 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
2b660 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
2b670 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
2b680 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
2b690 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2b6a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
2b6b0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2b6c0 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
2b6d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2b6e0 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
2b6f0 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
2b700 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
2b710 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
2b720 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
2b730 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
2b740 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
2b750 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2b760 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2b770 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
2b780 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
2b790 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
2b7a0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2b7b0 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
2b7c0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
2b7d0 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
2b7e0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2b7f0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2b800 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2b810 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
2b820 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
2b830 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
2b840 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
2b850 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
2b860 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
2b870 78 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74  x and and mark t
2b880 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72  hat ORDER BY ter
2b890 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a  m off .        *
2b8a0 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20  /.        bOnce 
2b8b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d  = 1;.        isM
2b8c0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
2b8d0 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
2b8e0 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
2b8f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2b900 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2b910 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2b920 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
2b930 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2b940 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2b950 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2b960 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pr);.          t
2b970 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
2b980 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2b990 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  PBY );.         
2b9a0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
2b9b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
2b9c0 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20  STINCTBY );.    
2b9d0 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
2b9e0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47  Flags & (WHERE_G
2b9f0 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53  ROUPBY|WHERE_DIS
2ba00 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62  TINCTBY))==0 ) b
2ba10 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
2ba20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2ba30 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
2ba40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ba50 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2ba60 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
2ba70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ba80 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2ba90 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
2baa0 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
2bab0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2bac0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
2bad0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2bae0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2baf0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2bb00 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2bb10 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2bb20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2bb30 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
2bb40 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
2bb50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2bb60 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
2bb70 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a  Name, pIndex->az
2bb80 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
2bb90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2bba0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73    }.          is
2bbb0 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  Match = 1;.     
2bbc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2bbd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2bbe0 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
2bbf0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2bc00 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
2bc10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69      testcase( di
2bc20 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30  stinctColumns==0
2bc30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2bc40 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
2bc50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2bc60 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
2bc70 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
2bc80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2bc90 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2bca0 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
2bcb0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
2bcc0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
2bcd0 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  e the sort order
2bce0 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69   is compatible i
2bcf0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
2bd00 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  ause..          
2bd10 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
2bd20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
2bd30 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
2bd40 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
2bd50 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
2bd60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bd70 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
2bd80 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
2bd90 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72  i].sortOrder ) r
2bda0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
2bdb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bdc0 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20            rev = 
2bdd0 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42  revIdx ^ pOrderB
2bde0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
2bdf0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2be00 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
2be10 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
2be20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
2be30 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
2be40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2be50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2be60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2be70 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68       /* No match
2be80 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
2be90 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20      if( j==0 || 
2bea0 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  j<nKeyCol ){.   
2beb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2bec0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2bed0 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
2bee0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2bef0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2bf00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bf10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2bf20 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
2bf30 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
2bf40 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
2bf50 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63       if( distinc
2bf60 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20  tColumns ){.    
2bf70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2bf80 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30  OrderDistinct==0
2bf90 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72   );.        isOr
2bfa0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
2bfb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
2bfc0 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65  * end-if not one
2bfd0 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  -row */..    /* 
2bfe0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68  Mark off any oth
2bff0 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  er ORDER BY term
2c000 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
2c010 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66   pLoop */.    if
2c020 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2c030 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  t ){.      order
2c040 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20  DistinctMask |= 
2c050 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2c060 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2c070 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
2c080 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
2c090 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  p;.        if( M
2c0a0 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
2c0b0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2c0c0 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72        p = pOrder
2c0d0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
2c0e0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 78 70          if( (exp
2c0f0 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49  rTableUsage(&pWI
2c100 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
2c110 29 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74  )&~orderDistinct
2c120 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
2c130 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2c140 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
2c150 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c160 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68   }.  } /* End th
2c170 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  e loop over all 
2c180 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20  WhereLoops from 
2c190 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20  outer-most down 
2c1a0 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f  to inner-most */
2c1b0 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62  .  if( obSat==ob
2c1c0 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Done ) return 1;
2c1d0 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44  .  if( !isOrderD
2c1e0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
2c1f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   0;.  return -1;
2c200 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
2c210 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
2c220 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75   For debugging u
2c230 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74  se only: */.stat
2c240 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
2c250 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65  herePathName(Whe
2c260 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69  rePath *pPath, i
2c270 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c  nt nLoop, WhereL
2c280 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73  oop *pLast){.  s
2c290 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65  tatic char zName
2c2a0 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  [65];.  int i;. 
2c2b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f   for(i=0; i<nLoo
2c2c0 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69  p; i++){ zName[i
2c2d0 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  ] = pPath->aLoop
2c2e0 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66  [i]->cId; }.  if
2c2f0 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b  ( pLast ) zName[
2c300 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49  i++] = pLast->cI
2c310 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  d;.  zName[i] = 
2c320 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d  0;.  return zNam
2c330 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  e;.}.#endif.../*
2c340 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
2c350 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
2c360 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
2c370 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
2c380 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
2c390 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
2c3a0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
2c3b0 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
2c3c0 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
2c3d0 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
2c3e0 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
2c3f0 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
2c400 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
2c410 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
2c420 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
2c430 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
2c440 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
2c450 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
2c460 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
2c470 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
2c480 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
2c490 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
2c4a0 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
2c4b0 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
2c4c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2c4d0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2c4e0 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
2c4f0 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
2c500 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
2c510 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
2c520 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
2c530 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
2c540 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
2c550 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
2c560 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
2c570 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2c580 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
2c590 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
2c5a0 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
2c5b0 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
2c5c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2c5d0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
2c5e0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
2c5f0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
2c600 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2c610 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
2c620 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2c630 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2c640 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2c650 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
2c660 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2c670 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2c680 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
2c690 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
2c6a0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2c6c0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2c6d0 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c6f0 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
2c700 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
2c710 0a 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b  .  LogEst rCost;
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c730 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a  Cost of a path *
2c740 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b  /.  LogEst nOut;
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c760 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
2c770 74 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ts */.  LogEst m
2c780 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
2c790 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
2c7a0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
2c7b0 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
2c7c0 6d 78 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20  mxOut = 0;      
2c7d0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f     /* Maximum nO
2c7e0 75 74 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20  ut value on the 
2c7f0 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
2c800 20 20 4c 6f 67 45 73 74 20 72 53 6f 72 74 43 6f    LogEst rSortCo
2c810 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2c820 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72 74  ost to do a sort
2c830 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
2c840 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
2c850 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2c860 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
2c870 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
2c880 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2c890 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
2c8a0 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
2c8b0 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
2c8c0 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
2c8d0 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
2c8e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
2c8f0 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
2c900 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
2c910 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
2c920 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
2c930 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
2c940 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
2c950 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
2c960 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2c970 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
2c980 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
2c990 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
2c9a0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
2c9b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
2c9c0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
2c9d0 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
2c9e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2c9f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
2ca00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
2ca10 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
2ca20 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
2ca30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
2ca40 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2ca50 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
2ca60 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
2ca70 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70   routine */..  p
2ca80 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2ca90 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
2caa0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
2cab0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
2cac0 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
2cad0 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
2cae0 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
2caf0 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
2cb00 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
2cb10 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
2cb20 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
2cb30 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
2cb40 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
2cb50 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
2cb60 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
2cb70 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
2cb80 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29  ice = (nLoop==1)
2cb90 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
2cba0 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
2cbb0 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
2cbc0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
2cbd0 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
2cbe0 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
2cbf0 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e  - begin solver\n
2cc00 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  "));..  /* Alloc
2cc10 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2cc20 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
2cc30 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20   and aFrom */.  
2cc40 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ii = (sizeof(Whe
2cc50 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
2cc60 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
2cc70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
2cc80 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
2cc90 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
2cca0 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ii);.  if( pSpac
2ccb0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2ccc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
2ccd0 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
2cce0 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
2ccf0 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
2cd00 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
2cd10 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
2cd20 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
2cd30 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
2cd40 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
2cd50 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
2cd60 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
2cd70 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
2cd80 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
2cd90 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
2cda0 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = pX;.  }..  /* 
2cdb0 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
2cdc0 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
2cdd0 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
2cde0 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
2cdf0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
2ce00 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
2ce10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
2ce20 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
2ce30 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20 63  ve 25.  If the c
2ce40 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
2ce50 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
2ce60 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
2ce70 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
2ce80 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20 20   the first 25.  
2ce90 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
2cea0 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
2ceb0 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
2cec0 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
2ced0 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
2cee0 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20  QueryLoop, 46); 
2cef0 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c   assert( 46==sql
2cf00 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29  ite3LogEst(25) )
2cf10 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a  ;.  nFrom = 1;..
2cf20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20    /* Precompute 
2cf30 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
2cf40 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65  ing the final re
2cf50 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65  sult set, if the
2cf60 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20   caller.  ** to 
2cf70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2cf80 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65  n() was concerne
2cf90 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20  d about sorting 
2cfa0 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d  */.  rSortCost =
2cfb0 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   0;.  if( pWInfo
2cfc0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2cfd0 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20   nRowEst==0 ){. 
2cfe0 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
2cff0 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
2d000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2d010 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65  TUNING: Estimate
2d020 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
2d030 67 20 69 73 20 34 38 2a 4e 2a 6c 6f 67 32 28 4e  g is 48*N*log2(N
2d040 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
2d050 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
2d060 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 54  f output rows. T
2d070 68 65 20 34 38 20 69 73 20 74 68 65 20 65 78 70  he 48 is the exp
2d080 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20 61 20  ected size of a 
2d090 72 6f 77 20 74 6f 20 73 6f 72 74 2e 20 0a 20 20  row to sort. .  
2d0a0 20 20 2a 2a 20 46 49 58 4d 45 3a 20 20 63 6f 6d    ** FIXME:  com
2d0b0 70 75 74 65 20 61 20 62 65 74 74 65 72 20 65 73  pute a better es
2d0c0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 34 38  timate of the 48
2d0d0 20 6d 75 6c 74 69 70 6c 69 65 72 20 62 61 73 65   multiplier base
2d0e0 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  d on the.    ** 
2d0f0 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
2d100 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 72  ssions. */.    r
2d110 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45  SortCost = nRowE
2d120 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77  st + estLog(nRow
2d130 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52 45 54  Est);.    WHERET
2d140 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d  RACE(0x002,("---
2d150 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
2d160 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 29  \n", rSortCost))
2d170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
2d180 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
2d190 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
2d1a0 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
2d1b0 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
2d1c0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
2d1d0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
2d1e0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
2d1f0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
2d200 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
2d210 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
2d220 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
2d230 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
2d240 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
2d250 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
2d260 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
2d270 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
2d280 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
2d290 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
2d2a0 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
2d2b0 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
2d2c0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
2d2d0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
2d2e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
2d2f0 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69  kNew;.        Bi
2d300 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
2d310 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  0;.        u8 is
2d320 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70  OrderedValid = p
2d330 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56  From->isOrderedV
2d340 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38  alid;.        u8
2d350 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
2d360 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
2d370 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
2d380 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
2d390 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
2d3a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2d3b0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
2d3c0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
2d3d0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
2d3e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2d3f0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
2d400 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
2d410 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
2d420 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
2d430 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
2d440 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
2d450 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  */.        rCost
2d460 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2d470 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74  Add(pWLoop->rSet
2d480 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20  up,pWLoop->rRun 
2d490 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a  + pFrom->nRow);.
2d4a0 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
2d4b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2d4c0 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72  (rCost, pFrom->r
2d4d0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6e  Cost);.        n
2d4e0 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
2d4f0 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
2d500 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
2d510 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
2d520 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
2d530 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
2d540 69 66 28 20 21 69 73 4f 72 64 65 72 65 64 56 61  if( !isOrderedVa
2d550 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lid ){.         
2d560 20 73 77 69 74 63 68 28 20 77 68 65 72 65 50 61   switch( wherePa
2d570 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
2d580 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
2d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5a0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
2d5b0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
2d5c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5e0 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
2d5f0 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29  oop, &revMask) )
2d600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
2d610 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20  se 1:  /* Yes.  
2d620 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65  pFrom+pWLoop doe
2d630 73 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  s satisfy the OR
2d640 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2d650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2d660 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20  sOrdered = 1;.  
2d670 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2d680 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
2d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2d6a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2d6b0 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e   case 0:  /* No.
2d6c0 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77    pFrom+pWLoop w
2d6d0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73 65  ill require a se
2d6e0 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20  parate sort */. 
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2d700 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20  rdered = 0;.    
2d710 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2d720 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
2d730 20 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73              rCos
2d740 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2d750 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72  tAdd(rCost, rSor
2d760 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tCost);.        
2d770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d780 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
2d790 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c  : /* Cannot tell
2d7a0 20 79 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e   yet.  Try again
2d7b0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65   on the next ite
2d7c0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
2d7d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d7e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d800 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
2d810 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
2d820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d830 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
2d840 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
2d850 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
2d860 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73   mxChoice best s
2d870 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2d880 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
2d890 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
2d8a0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
2d8b0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
2d8c0 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20  kLoop==maskNew. 
2d8d0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 54 6f            && pTo
2d8e0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2d8f0 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ==isOrderedValid
2d900 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
2d910 28 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f  (pTo->rCost<=rCo
2d920 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
2d930 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20 20  =nOut) ||.      
2d940 20 20 20 20 20 20 20 20 20 20 28 70 54 6f 2d 3e            (pTo->
2d950 72 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26 20  rCost>=rCost && 
2d960 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29  pTo->nRow>=nOut)
2d970 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
2d980 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2d990 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29  ase( jj==nTo-1 )
2d9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2d9b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2d9c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d9d0 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29     if( jj>=nTo )
2d9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d9f0 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26  nTo>=mxChoice &&
2da00 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29   rCost>=mxCost )
2da10 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
2da20 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
2da30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
2da40 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2da50 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2da70 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2da80 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
2da90 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
2daa0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
2dab0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
2dac0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
2dad0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
2dae0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2db00 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
2db10 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2db20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2db30 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2db40 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
2db50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2db60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
2db70 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20   Add a new Path 
2db80 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74  to the aTo[] set
2db90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2dba0 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
2dbb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2dbc0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
2dbd0 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
2dbe0 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
2dbf0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
2dc00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
2dc10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2dc20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
2dc30 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
2dc40 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
2dc50 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
2dc60 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
2dc70 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20    jj = mxI;.    
2dc80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dc90 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
2dca0 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
2dcb0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
2dcc0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
2dcd0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2dce0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
2dcf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dd00 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
2dd10 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64      %s cost=%-3d
2dd20 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
2dd30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dd40 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2dd50 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
2dd60 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
2dd70 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
2dd80 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
2dd90 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
2dda0 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2ddb0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
2ddc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2ddd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2dde0 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c   if( pTo->rCost<
2ddf0 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
2de00 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b 0a 23 69 66  Row<=nOut ){.#if
2de10 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2de20 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
2de30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2de40 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2de50 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
2de60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2de70 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
2de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
2de90 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
2dea0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
2deb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dec0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2ded0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2dee0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
2def0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
2df00 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2df10 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
2df20 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2df30 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2df40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2df50 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
2df60 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
2df70 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df90 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
2dfa0 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
2dfb0 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
2dfc0 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
2dfd0 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
2dfe0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
2dff0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f  pTo->isOrdered ?
2e000 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
2e010 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
2e020 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
2e030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2e040 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
2e050 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2e060 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2e070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e080 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
2e090 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b  Cost==rCost+1 );
2e0a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2e0b0 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20 73  new and better s
2e0c0 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76 69  core for a previ
2e0d0 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65 71  ously created eq
2e0e0 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f  uivalent path */
2e0f0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2e100 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
2e110 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
2e120 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2e130 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
2e140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2e150 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
2e160 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
2e170 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
2e180 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1a0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
2e1b0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
2e1c0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
2e1d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e1e0 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
2e1f0 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
2e200 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2e210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2e220 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2e230 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
2e240 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
2e250 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
2e260 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2e270 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
2e280 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
2e290 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2e2b0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
2e2c0 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
2e2d0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2e2e0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2e2f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2e300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
2e310 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
2e320 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
2e330 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
2e340 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
2e350 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
2e360 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
2e370 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
2e380 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
2e390 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
2e3a0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
2e3b0 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
2e3c0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
2e3d0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
2e3e0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
2e3f0 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65  edValid = isOrde
2e400 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
2e410 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
2e420 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
2e430 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
2e440 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
2e450 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
2e460 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
2e470 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
2e480 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
2e490 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
2e4a0 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
2e4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
2e4c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2e4d0 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
2e4e0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
2e4f0 20 6d 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e   mxOut = aTo[0].
2e500 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
2e510 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
2e520 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
2e530 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
2e540 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2e550 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
2e560 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f  ost || (pTo->rCo
2e570 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
2e580 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29  o->nRow>mxOut) )
2e590 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e5a0 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
2e5b0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
2e5c0 20 20 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e     mxOut = pTo->
2e5d0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
2e5e0 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20      mxI = jj;.  
2e5f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e610 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2e620 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2e630 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e  CE_ENABLED  /* >
2e640 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  =2 */.    if( sq
2e650 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e  lite3WhereTrace>
2e660 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
2e670 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e680 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64  ---- after round
2e690 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f   %d ----\n", iLo
2e6a0 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  op);.      for(i
2e6b0 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69  i=0, pTo=aTo; ii
2e6c0 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b  <nTo; ii++, pTo+
2e6d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
2e6e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e6f0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72   %s cost=%-3d nr
2e700 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  ow=%-3d order=%c
2e710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68  ",.           wh
2e720 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
2e730 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
2e740 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
2e750 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
2e760 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2e770 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
2e780 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
2e790 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
2e7a0 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
2e7b0 64 65 72 65 64 56 61 6c 69 64 20 26 26 20 70 54  deredValid && pT
2e7c0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  o->isOrdered ){.
2e7d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e7e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
2e7f0 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
2e800 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
2e810 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e820 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2e830 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
2e840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e850 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
2e860 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
2e870 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
2e880 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
2e890 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
2e8a0 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
2e8b0 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
2e8c0 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
2e8d0 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
2e8e0 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
2e8f0 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
2e900 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2e910 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
2e920 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
2e930 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2e940 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
2e950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e960 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
2e970 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
2e980 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
2e990 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
2e9a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
2e9b0 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
2e9c0 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
2e9d0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
2e9e0 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
2e9f0 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
2ea00 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
2ea10 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
2ea20 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
2ea30 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
2ea40 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
2ea50 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
2ea60 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
2ea70 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
2ea80 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
2ea90 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2eaa0 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
2eab0 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
2eac0 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
2ead0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
2eae0 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
2eaf0 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
2eb00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
2eb10 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
2eb20 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
2eb30 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
2eb40 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2eb50 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
2eb60 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
2eb70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2eb80 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2eb90 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26  ISTINCT)!=0.   &
2eba0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2ebb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
2ebc0 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20  STINCTBY)==0.   
2ebd0 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  && pWInfo->eDist
2ebe0 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
2ebf0 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20  INCT_NOOP.   && 
2ec00 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20  nRowEst.  ){.   
2ec10 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64   Bitmask notUsed
2ec20 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77  ;.    int rc = w
2ec30 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
2ec40 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
2ec50 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
2ec60 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  Set, pFrom,.    
2ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
2ec80 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
2ec90 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
2eca0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
2ecb0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2ecc0 28 20 72 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f  ( rc==1 ) pWInfo
2ecd0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2ece0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
2ecf0 45 52 45 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ERED;.  }.  if( 
2ed00 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
2ed10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
2ed20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2ed30 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2ed40 59 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  Y ){.      pWInf
2ed50 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2ed60 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2ed70 44 45 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  DERED;.    }else
2ed80 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2ed90 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20  bOBSat = 1;.    
2eda0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
2edb0 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
2edc0 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  op;.    }.  }.  
2edd0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
2ede0 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a  = pFrom->nRow;..
2edf0 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72    /* Free tempor
2ee00 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ary memory and r
2ee10 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f  eturn success */
2ee20 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2ee30 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
2ee40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ee50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20  ;.}../*.** Most 
2ee60 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79  queries use only
2ee70 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
2ee80 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f  (they are not jo
2ee90 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a  ins) and have.**
2eea0 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74   simple == const
2eeb0 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69  raints against i
2eec0 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20  ndexed fields.  
2eed0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
2eee0 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e  empts.** to plan
2eef0 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61   those simple ca
2ef00 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c  ses using much l
2ef10 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61  ess ceremony tha
2ef20 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c  n the.** general
2ef30 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
2ef40 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72  lanner, and ther
2ef50 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72  eby yield faster
2ef60 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2ef70 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20  ().** times for 
2ef80 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2ef90 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  .**.** Return no
2efa0 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n-zero on succes
2efb0 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79  s, if this query
2efc0 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20   can be handled 
2efd0 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72  by this.** no-fr
2efe0 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e  ills query plann
2eff0 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  er.  Return zero
2f000 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e   if this query n
2f010 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e  eeds the .** gen
2f020 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
2f030 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73  ry planner..*/.s
2f040 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53  tatic int whereS
2f050 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f  hortCut(WhereLoo
2f060 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2f070 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
2f080 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75   *pWInfo;.  stru
2f090 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2f0a0 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43  *pItem;.  WhereC
2f0b0 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
2f0c0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
2f0d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
2f0e0 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  op;.  int iCur;.
2f0f0 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65    int j;.  Table
2f100 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
2f110 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e  *pIdx;.  .  pWIn
2f120 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2f130 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49  WInfo;.  if( pWI
2f140 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2f150 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
2f160 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  BLE ) return 0;.
2f170 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
2f180 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
2f190 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d  >=1 );.  pItem =
2f1a0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2f1b0 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70  t->a;.  pTab = p
2f1c0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66  Item->pTab;.  if
2f1d0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2f1e0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
2f1f0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  if( pItem->zInde
2f200 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  x ) return 0;.  
2f210 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
2f220 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
2f230 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
2f240 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
2f250 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
2f260 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
2f270 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
2f280 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  kip = 0;.  pTerm
2f290 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
2f2a0 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
2f2b0 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
2f2c0 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
2f2d0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
2f2e0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
2f2f0 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
2f300 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
2f310 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
2f320 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
2f330 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
2f340 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2f350 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
2f360 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
2f370 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
2f380 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
2f390 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
2f3a0 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
2f3b0 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
2f3c0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
2f3d0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
2f3e0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
2f3f0 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
2f400 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  t( pLoop->aLTerm
2f410 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c  Space==pLoop->aL
2f420 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 61 73  Term );.      as
2f430 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
2f440 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
2f450 63 65 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ce)==4 );.      
2f460 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
2f470 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20 20  r==OE_None .    
2f480 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72     || pIdx->pPar
2f490 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20  tIdxWhere!=0 .  
2f4a0 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b       || pIdx->nK
2f4b0 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28  eyCol>ArraySize(
2f4c0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
2f4d0 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e  ce) .      ) con
2f4e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
2f4f0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
2f500 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
2f510 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
2f520 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
2f530 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2f540 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49  j], 0, WO_EQ, pI
2f550 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
2f560 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
2f570 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  k;.        pLoop
2f580 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54  ->aLTerm[j] = pT
2f590 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
2f5a0 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e     if( j!=pIdx->
2f5b0 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e  nKeyCol ) contin
2f5c0 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ue;.      pLoop-
2f5d0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2f5e0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
2f5f0 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e  _ONEROW|WHERE_IN
2f600 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28  DEXED;.      if(
2f610 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e   pIdx->isCoverin
2f620 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c  g || (pItem->col
2f630 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
2f640 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30  nIndex(pIdx))==0
2f650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
2f660 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
2f670 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
2f680 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
2f690 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
2f6a0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
2f6b0 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
2f6c0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
2f6d0 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
2f6e0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2f6f0 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
2f700 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
2f710 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
2f720 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
2f730 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33    /* 39==sqlite3
2f740 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20  LogEst(15) */.  
2f750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2f760 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
2f770 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
2f780 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
2f790 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57  LogEst)1;.    pW
2f7a0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
2f7b0 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
2f7c0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
2f7d0 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
2f7e0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
2f7f0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
2f800 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
2f810 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
2f820 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
2f830 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
2f840 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
2f850 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20 20  bOBSat =  1;.   
2f860 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
2f870 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f880 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
2f890 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2f8a0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2f8b0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2f8c0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
2f8d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2f8e0 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27  pLoop->cId = '0'
2f8f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
2f900 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2f910 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2f920 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
2f930 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
2f940 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
2f950 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2f960 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
2f970 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
2f980 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
2f990 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
2f9a0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
2f9b0 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
2f9c0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
2f9d0 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
2f9e0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
2f9f0 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
2fa00 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
2fa10 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
2fa20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2fa30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2fa40 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
2fa50 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
2fa60 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2fa70 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
2fa80 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
2fa90 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2faa0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
2fab0 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
2fac0 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
2fad0 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
2fae0 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
2faf0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
2fb00 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
2fb10 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
2fb20 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
2fb30 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
2fb40 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
2fb50 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
2fb60 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
2fb70 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
2fb80 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
2fb90 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
2fba0 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
2fbb0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
2fbc0 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
2fbd0 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
2fbe0 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
2fbf0 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
2fc00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2fc10 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
2fc20 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
2fc30 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
2fc40 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
2fc50 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2fc60 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
2fc70 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
2fc80 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
2fc90 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
2fca0 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
2fcb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
2fcc0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
2fcd0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2fce0 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
2fcf0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
2fd00 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
2fd30 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
2fd40 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
2fd60 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2fd70 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
2fd80 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
2fd90 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
2fda0 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
2fdb0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
2fdc0 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
2fdd0 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
2fde0 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
2fdf0 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
2fe00 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
2fe10 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
2fe20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
2fe30 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
2fe40 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
2fe50 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
2fe60 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
2fe70 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
2fe80 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
2fe90 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
2fea0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
2feb0 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
2fec0 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
2fed0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
2fee0 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
2fef0 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
2ff00 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
2ff10 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
2ff20 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
2ff30 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
2ff40 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
2ff50 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
2ff60 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2ff70 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2ff80 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
2ff90 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
2ffa0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2ffb0 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
2ffc0 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
2ffd0 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
2ffe0 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
2fff0 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
30000 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
30010 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
30020 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
30030 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
30040 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
30050 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
30060 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
30070 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
30080 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
30090 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
300a0 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
300b0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
300c0 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
300d0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
300e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
300f0 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
30100 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
30110 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
30120 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
30130 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
30140 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
30150 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
30160 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
30170 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
30180 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
30190 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
301a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
301b0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
301c0 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
301d0 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
301e0 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
301f0 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
30200 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
30210 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
30220 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
30230 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
30240 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
30250 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
30260 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
30270 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
30280 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
30290 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
302a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
302b0 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
302c0 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
302d0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
302e0 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
302f0 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
30300 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
30310 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
30320 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
30330 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30340 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
30350 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
30360 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
30370 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
30380 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
30390 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
303a0 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
303b0 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
303c0 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
303d0 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
303e0 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
303f0 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
30400 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
30410 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
30420 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
30430 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
30440 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
30450 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
30460 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
30470 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
30480 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
30490 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
304a0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
304b0 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
304c0 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
304d0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
304e0 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
304f0 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
30500 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
30510 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
30520 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
30530 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
30540 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
30550 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
30560 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
30570 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
30580 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72  ESSING.**.** pOr
30590 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
305a0 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
305b0 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68  BY clause (or th
305c0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
305d0 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  e.** if the WHER
305e0 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
305f0 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c  s set in wctrlFl
30600 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54  ags) of a SELECT
30610 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66   statement.** if
30620 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
30630 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
30640 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
30650 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
30660 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66  e.** is called f
30670 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72  rom an UPDATE or
30680 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
30690 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79  t, then pOrderBy
306a0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
306b0 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61  The iIdxCur para
306c0 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72  meter is the cur
306d0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  sor number of an
306e0 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20   index.  If .** 
306f0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
30700 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64 78  NLY is set, iIdx
30710 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  Cur is the curso
30720 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
30730 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66  ndex.** to use f
30740 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f  or OR clause pro
30750 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48  cessing.  The WH
30760 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  ERE clause shoul
30770 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70  d use this.** sp
30780 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20  ecific cursor.  
30790 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53  If WHERE_ONEPASS
307a0 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74 2c  _DESIRED is set,
307b0 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69 73   then iIdxCur is
307c0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 75  .** the first cu
307d0 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79  rsor in an array
307e0 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20   of cursors for 
307f0 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49  all indices.  iI
30800 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20  dxCur should.** 
30810 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  be used to compu
30820 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
30830 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64  te cursor depend
30840 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64  ing on which ind
30850 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a  ex is.** used..*
30860 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
30870 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
30880 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
30890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
308a0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
308b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
308c0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d  List,    /* FROM
308d0 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20   clause: A list 
308e0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
308f0 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
30900 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
30910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
30920 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
30930 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
30940 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
30950 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
30960 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
30970 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20  st *pResultSet, 
30980 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66  /* Result set of
30990 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
309a0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
309b0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
309c0 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
309d0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
309e0 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
309f0 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20  t iIdxCur       
30a00 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
30a10 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
30a20 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
30a30 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
30a40 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
30a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
30a60 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
30a70 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
30a80 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
30a90 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
30aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30ab0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
30ac0 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
30ad0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
30ae0 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
30af0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
30b00 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
30b10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
30b20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
30b30 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
30b40 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
30b50 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
30b60 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b70 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
30b80 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
30b90 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
30ba0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
30bb0 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
30bc0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
30bd0 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
30be0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
30bf0 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
30c00 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
30c10 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
30c20 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
30c30 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
30c40 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
30c50 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65  fo->a[] */.  Whe
30c60 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
30c70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
30c80 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57  er to a single W
30c90 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
30ca0 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
30cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cc0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
30cd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
30ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30cf0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
30d00 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
30d10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
30d20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30d30 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20   code */...  /* 
30d40 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c  Variable initial
30d50 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20  ization */.  db 
30d60 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
30d70 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c  memset(&sWLB, 0,
30d80 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a   sizeof(sWLB));.
30d90 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
30da0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
30db0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
30dc0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
30dd0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
30de0 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
30df0 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
30e00 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
30e10 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
30e20 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
30e30 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
30e40 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
30e50 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
30e60 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
30e70 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
30e80 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
30e90 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
30ea0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
30eb0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
30ec0 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
30ed0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
30ee0 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
30ef0 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
30f00 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
30f10 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
30f20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
30f30 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
30f40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
30f50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
30f60 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
30f70 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
30f80 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
30f90 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
30fa0 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
30fb0 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
30fc0 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
30fd0 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
30fe0 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
30ff0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
31000 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
31010 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
31020 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
31030 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
31040 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
31050 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
31060 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
31070 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
31080 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
31090 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
310a0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
310b0 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
310c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
310d0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
310e0 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
310f0 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
31100 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
31110 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
31120 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
31130 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
31140 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
31150 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
31160 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
31170 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
31180 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
31190 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
311a0 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
311b0 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
311c0 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
311d0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
311e0 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
311f0 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
31200 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
31210 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
31220 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
31230 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
31240 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
31250 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
31260 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
31270 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
31280 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
31290 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
312a0 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
312b0 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
312c0 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
312d0 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
312e0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
312f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
31300 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
31310 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
31320 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
31330 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
31340 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
31350 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
31360 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
31370 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
31380 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
31390 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
313a0 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
313b0 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
313c0 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
313d0 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
313e0 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
313f0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
31400 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
31410 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
31420 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
31430 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
31440 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
31450 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  t = pResultSet;.
31460 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
31470 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
31480 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
31490 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
314a0 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
314b0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
314c0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
314d0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
314e0 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
314f0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
31500 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
31510 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
31520 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
31530 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
31540 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
31550 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
31560 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
31570 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
31580 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
31590 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
315a0 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
315b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
315c0 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
315d0 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
315e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
315f0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
31600 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
31610 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
31620 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
31630 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
31640 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
31650 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
31660 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
31670 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(pMaskSet);.  w
31680 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
31690 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
316a0 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  nfo);.  whereSpl
316b0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
316c0 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
316d0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
316e0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
316f0 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
31700 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
31710 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
31720 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
31730 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
31740 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
31750 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
31760 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
31770 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
31780 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
31790 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
317a0 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
317b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c  for(ii=0; ii<sWL
317c0 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69  B.pWC->nTerm; ii
317d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61  ++){.    if( nTa
317e0 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
317f0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
31800 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57  tNotJoin(sWLB.pW
31810 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20  C->a[ii].pExpr) 
31820 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31830 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
31840 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b  se, sWLB.pWC->a[
31850 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66  ii].pExpr, pWInf
31860 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20  o->iBreak,.     
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31880 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49      SQLITE_JUMPI
31890 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57  FNULL);.      sW
318a0 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74  LB.pWC->a[ii].wt
318b0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
318c0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  DED;.    }.  }..
318d0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
318e0 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73  e: No FROM claus
318f0 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61  e.  */.  if( nTa
31900 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  bList==0 ){.    
31910 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
31920 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20  WInfo->bOBSat = 
31930 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  1;.    if( wctrl
31940 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
31950 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
31960 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
31970 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
31980 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
31990 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
319a0 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
319b0 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
319c0 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
319d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
319e0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
319f0 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
31a00 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
31a10 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
31a20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
31a30 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
31a40 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
31a50 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
31a60 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
31a70 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
31a80 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
31a90 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
31aa0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
31ab0 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
31ac0 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
31ad0 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
31ae0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
31af0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
31b00 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
31b10 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
31b20 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
31b30 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
31b40 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
31b50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
31b60 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
31b70 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
31b80 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
31b90 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
31ba0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
31bb0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
31bc0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
31bd0 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
31be0 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
31bf0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
31c00 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
31c10 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
31c20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
31c30 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
31c40 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
31c50 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
31c60 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
31c70 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54  ables in.  ** pT
31c80 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
31c90 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
31ca0 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
31cb0 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
31cc0 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  y.  ** equal to 
31cd0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
31ce0 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
31cf0 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
31d00 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45  e.  ** WHERE_ONE
31d10 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
31d20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66  is set..  */.  f
31d30 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
31d40 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
31d50 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
31d60 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
31d70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
31d80 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
31d90 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
31da0 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
31db0 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
31dc0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
31dd0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
31de0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
31df0 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
31e00 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
31e10 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
31e20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
31e30 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
31e40 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
31e50 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
31e60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
31e70 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
31e80 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
31e90 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
31ea0 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
31eb0 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
31ec0 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
31ed0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
31ee0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
31ef0 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
31f00 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
31f10 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
31f20 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
31f30 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
31f40 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
31f50 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
31f60 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
31f70 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
31f80 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
31f90 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
31fa0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
31fb0 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
31fc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
31fd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
31fe0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
31ff0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
32000 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
32010 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e 74   BY) clause cont
32020 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  ains references 
32030 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20  to general.  ** 
32040 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65  expressions, the
32050 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61 62  n we won't be ab
32060 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69 74  le to satisfy it
32070 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c 20   using indices, 
32080 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64  so.  ** go ahead
32090 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74 20   and disable it 
320a0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
320b0 70 4f 72 64 65 72 42 79 20 26 26 20 28 77 63 74  pOrderBy && (wct
320c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
320d0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
320e0 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d  0 ){.    for(ii=
320f0 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e  0; ii<pOrderBy->
32100 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
32110 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
32120 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
32130 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
32140 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  y->a[ii].pExpr);
32150 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
32160 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
32170 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
32180 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
32190 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
321a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
321b0 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
321c0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
321d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
321e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
321f0 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
32200 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
32210 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
32220 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
32230 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
32240 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
32250 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
32260 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
32270 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
32280 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
32290 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
322a0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
322b0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
322c0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
322d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
322e0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
322f0 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
32300 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
32310 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
32320 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
32330 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
32340 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
32350 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
32360 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
32370 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
32380 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
32390 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
323a0 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
323b0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
323c0 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
323d0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
323e0 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
323f0 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73 70  \n"));.  /* Disp
32400 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  lay all terms of
32410 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
32420 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  e */.#if defined
32430 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
32440 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64 28  LED) && defined(
32450 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
32460 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69 66  EE_EXPLAIN).  if
32470 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
32480 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
32490 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
324a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
324b0 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69 74  pVdbe;.    sqlit
324c0 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 76  e3ExplainBegin(v
324d0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
324e0 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
324f0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  m; i++){.      s
32500 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
32510 6e 74 66 28 76 2c 20 22 23 25 2d 32 64 20 22 2c  ntf(v, "#%-2d ",
32520 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   i);.      sqlit
32530 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29  e3ExplainPush(v)
32540 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70  ;.      whereExp
32550 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26 73 57 4c  lainTerm(v, &sWL
32560 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20 20  B.pWC->a[i]);.  
32570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
32580 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20  inPop(v);.      
32590 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
325a0 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
325b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e  qlite3ExplainFin
325c0 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ish(v);.    sqli
325d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
325e0 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  %s", sqlite3Vdbe
325f0 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b  Explanation(v));
32600 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
32610 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c  ( nTabList!=1 ||
32620 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26   whereShortCut(&
32630 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sWLB)==0 ){.    
32640 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
32650 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20  dAll(&sWLB);.   
32660 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
32670 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
32680 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61    .    /* Displa
32690 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  y all of the Whe
326a0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69  reLoop objects i
326b0 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20  f wheretrace is 
326c0 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65  enabled */.#ifde
326d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
326e0 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20  BLED /* !=0 */. 
326f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
32700 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
32710 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
32720 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
32730 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
32740 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34  Label[] = "01234
32750 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b  56789abcdefghijk
32760 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22  lmnopqrstuvwyxz"
32770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32790 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47          "ABCDEFG
327a0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
327b0 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  YXZ";.      for(
327c0 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
327d0 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70  , i=0; p; p=p->p
327e0 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a  NextLoop, i++){.
327f0 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d          p->cId =
32800 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66   zLabel[i%sizeof
32810 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20  (zLabel)];.     
32820 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
32830 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  t(p, sWLB.pWC);.
32840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
32850 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72  ndif.  .    wher
32860 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
32870 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
32880 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
32890 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
328a0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  inError;.    if(
328b0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
328c0 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72  y ){.       wher
328d0 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
328e0 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  fo, pWInfo->nRow
328f0 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69  Out+1);.       i
32900 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
32910 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
32920 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
32930 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
32940 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
32950 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
32960 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
32970 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  der)!=0 ){.     
32980 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
32990 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b  = (Bitmask)(-1);
329a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
329b0 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52  e->nErr || NEVER
329c0 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
329d0 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  d) ){.    goto w
329e0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
329f0 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45    }.#ifdef WHERE
32a00 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
32a10 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73 71   !=0 */.  if( sq
32a20 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
32a30 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  ){.    int ii;. 
32a40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32a50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75  rintf("---- Solu
32a60 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70  tion nRow=%d", p
32a70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
32a80 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32a90 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20  >bOBSat ){.     
32aa0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32ab0 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78  ntf(" ORDERBY=0x
32ac0 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72  %llx", pWInfo->r
32ad0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  evMask);.    }. 
32ae0 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66     switch( pWInf
32af0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a  o->eDistinct ){.
32b00 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
32b10 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
32b20 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
32b30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32b40 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75    DISTINCT=uniqu
32b50 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  e");.        bre
32b60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
32b70 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
32b80 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
32b90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32ba0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
32bb0 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22  ISTINCT=ordered"
32bc0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32be0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
32bf0 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b  NCT_UNORDERED: {
32c00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32c10 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
32c20 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65  ISTINCT=unordere
32c30 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
32c40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
32c50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
32c60 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
32c70 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
32c80 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
32c90 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68   ii++){.      wh
32ca0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49  ereLoopPrint(pWI
32cb0 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f  nfo->a[ii].pWLoo
32cc0 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
32cd0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
32ce0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f   /* Attempt to o
32cf0 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20  mit tables from 
32d00 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f  the join that do
32d10 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20   not effect the 
32d20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20  result */.  if( 
32d30 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
32d40 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53  2.   && pResultS
32d50 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  et!=0.   && Opti
32d60 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
32d70 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e  db, SQLITE_OmitN
32d80 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20  oopJoin).  ){.  
32d90 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65    Bitmask tabUse
32da0 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c  d = exprListTabl
32db0 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
32dc0 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20   pResultSet);.  
32dd0 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65    if( sWLB.pOrde
32de0 72 42 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d  rBy ) tabUsed |=
32df0 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
32e00 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
32e10 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
32e20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
32e30 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20  >nLevel>=2 ){.  
32e40 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
32e50 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  Term, *pEnd;.   
32e60 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
32e70 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  o->a[pWInfo->nLe
32e80 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  vel-1].pWLoop;. 
32e90 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
32ea0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
32eb0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74  oop->iTab].joint
32ec0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d  ype & JT_LEFT)==
32ed0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
32ee0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
32ef0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
32f00 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20  STINCT)==0.     
32f10 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
32f20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
32f30 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ROW)==0.      ){
32f40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
32f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32f60 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f  ( (tabUsed & pLo
32f70 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
32f80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32f90 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d  pEnd = sWLB.pWC-
32fa0 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e  >a + sWLB.pWC->n
32fb0 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
32fc0 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e  pTerm=sWLB.pWC->
32fd0 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70  a; pTerm<pEnd; p
32fe0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
32ff0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
33000 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
33010 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20  maskSelf)!=0.   
33020 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
33030 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
33040 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
33050 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  oin).        ){.
33060 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
33070 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33080 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65   }.      if( pTe
33090 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b  rm<pEnd ) break;
330a0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
330b0 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64  E(0xffff, ("-> d
330c0 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20  rop loop %c not 
330d0 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e  used\n", pLoop->
330e0 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49  cId));.      pWI
330f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20  nfo->nLevel--;. 
33100 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b       nTabList--;
33110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45  .    }.  }.  WHE
33120 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
33130 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
33140 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
33150 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
33160 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
33170 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
33180 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
33190 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
331a0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
331b0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
331c0 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
331d0 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
331e0 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
331f0 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
33200 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
33210 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73   ** The one-pass
33220 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20   algorithm only 
33230 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45  works if the WHE
33240 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
33250 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73 74  ains.  ** the st
33260 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74  atement to updat
33270 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a  e a single row..
33280 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
33290 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
332a0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
332b0 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
332c0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
332d0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
332e0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
332f0 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20  _DESIRED)!=0 .  
33300 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30   && (pWInfo->a[0
33310 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
33320 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
33330 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
33340 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
33350 31 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f  1;.    if( HasRo
33360 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  wid(pTabList->a[
33370 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
33380 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
33390 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
333a0 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
333b0 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
333c0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
333d0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
333e0 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
333f0 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
33400 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
33410 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
33420 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
33430 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
33440 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
33450 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
33460 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
33470 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
33480 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
33490 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
334a0 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
334b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
334c0 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
334d0 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
334e0 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
334f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
33500 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61  abItem;..    pTa
33510 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
33520 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
33530 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
33540 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
33550 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
33560 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
33570 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
33580 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
33590 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
335a0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
335b0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
335c0 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
335d0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
335e0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
335f0 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g */.    }else.#
33600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33610 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
33620 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
33630 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
33640 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
33650 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
33660 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
33670 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
33680 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
33690 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
336a0 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
336b0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
336c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
336d0 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
336e0 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
336f0 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
33700 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
33710 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
33720 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a       /* noop */.
33730 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
33740 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
33750 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
33760 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
33770 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
33780 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
33790 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
337a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
337b0 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
337c0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
337d0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a  o->okOnePass ){.
337e0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
337f0 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
33800 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
33810 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61  OnePass[0] = pTa
33820 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
33830 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73        };.      s
33840 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
33850 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
33860 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
33870 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
33880 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
33890 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76  m->iCursor==pLev
338a0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20  el->iTabCur );. 
338b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
338c0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
338d0 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  s && pTab->nCol=
338e0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
338f0 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66  testcase( !pWInf
33900 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
33910 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20  pTab->nCol==BMS 
33920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  );.      if( !pW
33930 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
33940 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d  && pTab->nCol<BM
33950 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54  S && HasRowid(pT
33960 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42  ab) ){.        B
33970 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
33980 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
33990 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
339a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
339b0 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
339c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
339d0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
339e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
339f0 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20  ntAddr(v)-1, .  
33a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a10 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
33a20 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
33a30 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
33a40 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
33a50 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
33a60 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
33a70 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
33a80 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
33a90 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
33aa0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
33ab0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
33ac0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
33ad0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
33ae0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
33af0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
33b00 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
33b10 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  int iIndexCur;. 
33b20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
33b30 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
33b40 20 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20 61   /* iIdxCur is a
33b50 6c 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20  lways set if to 
33b60 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
33b70 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70   if ONEPASS is p
33b80 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ossible */.     
33b90 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
33ba0 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e  !=0 || (pWInfo->
33bb0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33bc0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
33bd0 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)==0 );.      
33be0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  if( pWInfo->okOn
33bf0 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20  ePass ){.       
33c00 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61   Index *pJ = pTa
33c10 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e  bItem->pTab->pIn
33c20 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e  dex;.        iIn
33c30 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  dexCur = iIdxCur
33c40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
33c50 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
33c60 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
33c70 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  IRED );.        
33c80 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a  while( ALWAYS(pJ
33c90 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a  ) && pJ!=pIx ){.
33ca0 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78            iIndex
33cb0 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Cur++;.         
33cc0 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b   pJ = pJ->pNext;
33cd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33ce0 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
33cf0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
33d00 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
33d10 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75  ss[1] = iIndexCu
33d20 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
33d30 66 28 20 69 49 64 78 43 75 72 20 26 26 20 28 77  f( iIdxCur && (w
33d40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33d50 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
33d60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
33d70 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43  IndexCur = iIdxC
33d80 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ur;.      }else{
33d90 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
33da0 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
33db0 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b++;.      }.   
33dc0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
33dd0 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  ur = iIndexCur;.
33de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
33df0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
33e00 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
33e10 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
33e20 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
33e30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33e40 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78  p3(v, op, iIndex
33e50 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
33e60 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
33e70 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
33e80 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
33e90 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
33ea0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
33eb0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
33ec0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
33ed0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
33ee0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
33ef0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
33f00 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
33f10 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d  askSet, pTabItem
33f20 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->iCursor);.  }.
33f30 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
33f40 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33f50 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
33f60 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
33f70 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
33f80 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a  eginError;..  /*
33f90 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
33fa0 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
33fb0 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
33fc0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
33fd0 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
33fe0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
33ff0 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
34000 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
34010 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
34020 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
34030 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
34040 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54   for(ii=0; ii<nT
34050 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20  abList; ii++){. 
34060 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
34070 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69 66 6e  nfo->a[ii];.#ifn
34080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34090 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
340a0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
340b0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
340c0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
340d0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
340e0 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
340f0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
34100 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20   &pWInfo->sWC,. 
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
34120 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
34130 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52  el->iFrom], notR
34140 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
34150 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
34160 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
34170 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
34180 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
34190 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
341a0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
341b0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20  st, pLevel, ii, 
341c0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
341d0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
341e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
341f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
34200 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
34210 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
34220 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
34230 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61  Info, ii, notRea
34240 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
34250 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65  >iContinue = pLe
34260 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20  vel->addrCont;. 
34270 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
34280 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
34290 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
342a0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
342b0 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
342c0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
342d0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
342e0 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
342f0 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
34300 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
34310 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
34320 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
34330 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
34340 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
34350 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
34360 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
34370 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
34380 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
34390 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
343a0 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
343b0 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
343c0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
343d0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
343e0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
343f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
34400 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
34410 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
34420 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
34430 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
34440 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
34450 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
34460 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
34470 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  op;.  SrcList *p
34480 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
34490 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71  ->pTabList;.  sq
344a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
344b0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65  se->db;..  /* Ge
344c0 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
344d0 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
344e0 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
344f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
34500 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20  WHERE-core"));. 
34510 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
34520 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
34530 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
34540 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
34550 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i--){.    int ad
34560 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  dr;.    pLevel =
34570 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
34580 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
34590 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
345a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
345b0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
345c0 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
345d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
345e0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
345f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34600 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
34610 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
34620 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
34630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
34640 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
34650 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
34660 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
34670 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
34680 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
34690 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
346a0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
346b0 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
346c0 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
346d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
346e0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
346f0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
34700 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
34710 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
34720 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
34730 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
34740 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
34750 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34760 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
34770 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
34780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34790 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
347a0 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
347b0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
347c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
347d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
347e0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
347f0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
34800 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
34810 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
34820 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
34830 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
34840 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
34850 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
34860 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
34870 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20  l->addrSkip ){. 
34880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34890 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
348a0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
348b0 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56  drSkip);.      V
348c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
348d0 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f  next skip-scan o
348e0 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  n %s", pLoop->u.
348f0 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
34900 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
34910 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
34920 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
34930 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Skip);.      sql
34940 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
34950 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
34960 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20  Skip-2);.    }. 
34970 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
34980 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
34990 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
349a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
349b0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
349c0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
349d0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
349e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
349f0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
34a00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
34a10 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
34a20 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
34a30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
34a40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
34a50 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
34a60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
34a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
34a80 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
34a90 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
34aa0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
34ab0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
34ac0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
34ad0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
34ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34af0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
34b00 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
34b10 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
34b20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
34b30 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
34b40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34b50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34b60 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
34b70 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
34b80 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
34b90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
34ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34bb0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
34bc0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
34bd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34be0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34bf0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
34c00 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64     }.    VdbeMod
34c10 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
34c20 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64  End WHERE-loop%d
34c30 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20  : %s", i,.      
34c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
34c50 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
34c60 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
34c70 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ].pTab->zName));
34c80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
34c90 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
34ca0 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
34cb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
34cc0 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
34cd0 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
34ce0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
34cf0 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
34d00 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73  ->iBreak);..  as
34d10 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
34d20 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e  evel<=pTabList->
34d30 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nSrc );.  for(i=
34d40 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
34d50 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  ->a; i<pWInfo->n
34d60 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76  Level; i++, pLev
34d70 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
34d80 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
34d90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
34da0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
34db0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
34dc0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
34dd0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
34de0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
34df0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
34e00 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
34e10 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
34e20 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  ;..    /* Close 
34e30 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
34e40 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
34e50 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
34e60 65 72 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a  ereBegin..    **
34e70 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
34e80 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 74 68  close cursors th
34e90 61 74 20 77 69 6c 6c 20 62 65 20 72 65 75 73 65  at will be reuse
34ea0 64 20 62 79 20 74 68 65 20 4f 52 20 6f 70 74 69  d by the OR opti
34eb0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
34ec0 28 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e  (WHERE_OMIT_OPEN
34ed0 5f 43 4c 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f  _CLOSE).  And do
34ee0 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20 4f   not close the O
34ef0 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72 73  P_OpenWrite curs
34f00 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  ors.    ** creat
34f10 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50 41  ed for the ONEPA
34f20 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
34f30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34f40 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
34f50 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
34f60 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d  =0.     && pTab-
34f70 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20  >pSelect==0.    
34f80 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
34f90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
34fa0 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
34fb0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
34fc0 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d   int ws = pLoop-
34fd0 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
34fe0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
34ff0 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
35000 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
35010 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
35020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
35030 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
35040 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
35050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35060 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
35070 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
35080 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52    && (ws & (WHER
35090 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f  E_IPK|WHERE_AUTO
350a0 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20  _INDEX))==0 .   
350b0 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69      && pLevel->i
350c0 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e  IdxCur!=pWInfo->
350d0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a  aiCurOnePass[1].
350e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
350f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35100 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
35110 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
35120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35130 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
35140 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
35150 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f  ex, make VDBE co
35160 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
35170 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
35180 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
35190 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66  dex instead of f
351a0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68  rom the table wh
351b0 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  ere possible.  I
351c0 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20  n some cases.   
351d0 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a   ** this optimiz
351e0 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74  ation prevents t
351f0 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76  he table from ev
35200 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77  er being read, w
35210 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20  hich can.    ** 
35220 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63  yield a signific
35230 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ant performance 
35240 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20  boost..    ** . 
35250 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
35260 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
35270 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
35280 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
35290 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
352a0 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
352b0 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
352c0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
352d0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
352e0 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
352f0 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
35300 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
35310 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
35320 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
35330 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
35340 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
35350 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
35360 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
35370 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
35380 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
35390 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
353a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48  WHERE_INDEXED|WH
353b0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
353c0 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
353d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
353e0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  dex;.    }else i
353f0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
35400 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
35410 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OR ){.      pIdx
35420 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f   = pLevel->u.pCo
35430 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vidx;.    }.    
35440 69 66 28 20 70 49 64 78 20 26 26 20 21 64 62 2d  if( pIdx && !db-
35450 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
35460 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61  .      int k, la
35470 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
35480 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20 6c 61   *pOp;..      la
35490 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
354a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
354b0 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c        k = pLevel
354c0 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20  ->addrBody;.    
354d0 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
354e0 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a  dbeGetOp(v, k);.
354f0 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61        for(; k<la
35500 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
35510 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
35520 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
35530 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
35540 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
35550 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
35560 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
35570 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70    int x = pOp->p
35580 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  2;.          ass
35590 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c  ert( pIdx->pTabl
355a0 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  e==pTab );.     
355b0 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
355c0 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
355d0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
355e0 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
355f0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
35600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
35610 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
35620 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  [x];.          }
35630 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
35640 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
35650 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20  dex(pIdx, x);.  
35660 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30          if( x>=0
35670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35680 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20  pOp->p2 = x;.   
35690 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
356a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
356b0 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ur;.          }.
356c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
356d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
356e0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
356f0 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29  LY)==0 || x>=0 )
35700 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
35710 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
35720 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
35730 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
35740 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
35750 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
35760 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
35770 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
35780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35790 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
357a0 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
357b0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
357c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
357d0 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
357e0 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
357f0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
35800 6e 3b 0a 7d 0a                                   n;.}.