/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact bacb79fb31e082c9c599e68e5e9f161e1d5430ca:


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 61 73   iIdxCur;.    as
1cb70 73 65 72 74 28 20 28 57 48 45 52 45 5f 55 4e 51  sert( (WHERE_UNQ
1cb80 5f 57 41 4e 54 45 44 3e 3e 31 36 29 3d 3d 31 20  _WANTED>>16)==1 
1cb90 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
1cba0 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  3 = (pLoop->wsFl
1cbb0 61 67 73 3e 3e 31 36 29 26 31 3b 0a 20 20 20 20  ags>>16)&1;.    
1cbc0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1cbd0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
1cbe0 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  TRAINT)==0 ){.  
1cbf0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
1cc00 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
1cc10 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
1cc20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cc30 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
1cc40 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
1cc50 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
1cc60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
1cc70 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
1cc80 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1cc90 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
1cca0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43  I_OR ){.    /* C
1ccb0 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 5:  Two or m
1ccc0 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
1ccd0 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
1cce0 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
1ccf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1cd00 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1cd10 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1cd20 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
1cd30 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1cd40 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
1cd50 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1cd60 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
1cd70 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  b);.    **   CRE
1cd80 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
1cd90 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  t1(c);.    **.  
1cda0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
1cdb0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1cdc0 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31  5 OR b=7 OR (c=1
1cdd0 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20  1 AND d=13).    
1cde0 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65  **.    ** In the
1cdf0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
1ce00 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65  are three indexe
1ce10 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
1ce20 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20  d by OR..    ** 
1ce30 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
1ce40 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  oop looks like t
1ce50 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
1ce60 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
1ce70 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
1ce80 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
1ce90 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
1cea0 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   1.    **.    **
1ceb0 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
1cec0 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68  indexed term, th
1ced0 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65  e following. The
1cee0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
1cef0 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20    ** RowSetTest 
1cf00 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68  are such that th
1cf10 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
1cf20 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e  urrent row is in
1cf30 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  serted.    ** in
1cf40 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49  to the RowSet. I
1cf50 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
1cf60 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c  present, control
1cf70 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a   skips the.    *
1cf80 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61  * Gosub opcode a
1cf90 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68  nd jumps straigh
1cfa0 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  t to the code ge
1cfb0 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65  nerated by Where
1cfc0 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  End()..    **.  
1cfd0 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
1cfe0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74  te3WhereBegin(<t
1cff0 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20  erm>).    **    
1d000 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74        RowSetTest
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64    # Insert rowid
1d030 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20   into rowset.   
1d040 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73   **          Gos
1d050 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20  ub      2 A.    
1d060 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1d070 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20  3WhereEnd().    
1d080 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77  **.    ** Follow
1d090 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63  ing the above, c
1d0a0 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ode to terminate
1d0b0 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c   the loop. Label
1d0c0 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20   A, the target. 
1d0d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73     ** of the Gos
1d0e0 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20  ub above, jumps 
1d0f0 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
1d100 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74  on right after t
1d110 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a  he Goto..    **.
1d120 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1d130 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
1d140 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
1d150 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
1d160 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20   reg 1.    **   
1d170 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20         Goto     
1d180 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20    B             
1d190 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73     # The loop is
1d1a0 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a   finished..    *
1d1b0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  *.    **       A
1d1c0 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20  : <loop body>   
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d1e0 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61  Return data, wha
1d1f0 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  tever..    **.  
1d200 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65    **          Re
1d210 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20  turn     2      
1d220 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70            # Jump
1d230 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73   back to the Gos
1d240 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ub.    **.    **
1d250 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72         B: <after
1d260 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a   the loop>.    *
1d270 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65  *.    */.    Whe
1d280 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
1d290 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
1d2a0 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
1d2b0 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
1d2c0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f  .    SrcList *pO
1d2d0 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53  rTab;       /* S
1d2e0 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
1d2f0 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65  ist or OR-clause
1d300 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
1d310 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d     Index *pCov =
1d320 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d330 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76  /* Potential cov
1d340 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20  ering index (or 
1d350 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL) */.    int
1d360 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73   iCovCur = pPars
1d370 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43  e->nTab++;  /* C
1d380 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69  ursor used for i
1d390 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61  ndex scans (if a
1d3a0 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ny) */..    int 
1d3b0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
1d3c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
1d3d0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1d3e0 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
1d3f0 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
1d400 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1d430 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
1d440 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
1d450 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d470 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1d480 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
1d490 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
1d4a0 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
1d4b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
1d4c0 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
1d4d0 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
1d4e0 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1d510 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
1d520 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
1d530 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
1d540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d550 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
1d560 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
1d570 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d5a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1d5b0 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70     Expr *pAndExp
1d5c0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1d5d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20        /* An ".. 
1d5e0 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65  AND (...)" expre
1d5f0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20  ssion */.   .   
1d600 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1d610 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
1d620 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1d630 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d640 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1d650 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  & WO_OR );.    a
1d660 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
1d670 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
1d680 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
1d690 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
1d6a0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
1d6b0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1d6c0 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
1d6d0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
1d6e0 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
1d6f0 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
1d700 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
1d710 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1d720 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
1d730 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1d740 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
1d750 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
1d760 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
1d770 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
1d780 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
1d790 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
1d7a0 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
1d7b0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
1d7c0 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
1d7d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
1d7e0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
1d7f0 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
1d800 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
1d810 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1d820 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
1d830 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
1d840 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d850 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
1d860 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
1d870 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
1d880 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
1d890 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
1d8a0 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
1d8b0 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
1d8c0 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
1d8d0 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  w(db,.          
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62    sizeof(*pOrTab
1d900 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a  )+ nNotReady*siz
1d910 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d  eof(pOrTab->a[0]
1d920 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ));.      if( pO
1d930 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  rTab==0 ) return
1d940 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20   notReady;.     
1d950 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20   pOrTab->nAlloc 
1d960 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79  = (u8)(nNotReady
1d970 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
1d980 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
1d990 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
1d9a0 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
1d9b0 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
1d9c0 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
1d9d0 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
1d9e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1d9f0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
1da00 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
1da10 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
1da20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
1da30 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
1da40 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
1da50 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
1da60 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
1da70 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1da80 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
1da90 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
1daa0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
1dab0 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
1dac0 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
1dad0 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
1dae0 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
1daf0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
1db00 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
1db10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1db20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
1db30 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
1db40 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
1db50 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
1db60 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
1db70 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
1db80 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
1db90 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
1dba0 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
1dbb0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
1dbc0 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
1dbd0 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
1dbe0 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
1dbf0 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
1dc00 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
1dc10 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
1dc20 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
1dc30 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
1dc40 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
1dc50 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
1dc60 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
1dc70 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
1dc80 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
1dc90 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
1dca0 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1dcb0 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
1dcc0 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
1dcd0 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
1dce0 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
1dcf0 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
1dd00 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
1dd10 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1dd20 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
1dd30 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  K)==0 ){.      r
1dd40 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
1dd50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1dd60 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
1dd70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1dd80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dd90 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1dda0 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
1ddb0 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69     }.    iRetIni
1ddc0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
1ddd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1dde0 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72  ger, 0, regRetur
1ddf0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
1de00 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1de10 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66  E clause is z of
1de20 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20   the form:  (x1 
1de30 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e  OR x2 OR ...) AN
1de40 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  D y.    ** Then 
1de50 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78  for every term x
1de60 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74  N, evaluate as t
1de70 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
1de80 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a  : xN AND z.    *
1de90 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d  * That way, term
1dea0 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20  s in y that are 
1deb0 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68  factored into th
1dec0 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69  e disjunction wi
1ded0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63  ll.    ** be pic
1dee0 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65  ked up by the re
1def0 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1df00 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1df10 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20  in() below..    
1df20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c  **.    ** Actual
1df30 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72  ly, each subexpr
1df40 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72  ession is conver
1df50 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77  ted to "xN AND w
1df60 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20  " where w is.   
1df70 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73   ** the "interes
1df80 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a  ting" terms of z
1df90 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69   - terms that di
1dfa0 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
1dfb0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e  in the.    ** ON
1dfc0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1dfd0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1dfe0 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20   and terms that 
1dff0 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20  are usable as . 
1e000 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20     ** indices.. 
1e010 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1e020 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  s optimization a
1e030 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  lso only applies
1e040 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78   if the (x1 OR x
1e050 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20  2 OR ...) term. 
1e060 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e     ** is not con
1e070 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e  tained in the ON
1e080 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
1e090 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53  T JOIN..    ** S
1e0a0 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f  ee ticket http:/
1e0b0 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
1e0c0 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30  src/info/f236930
1e0d0 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  4e4.    */.    i
1e0e0 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20  f( pWC->nTerm>1 
1e0f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65  ){.      int iTe
1e100 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54  rm;.      for(iT
1e110 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43  erm=0; iTerm<pWC
1e120 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b  ->nTerm; iTerm++
1e130 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
1e140 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b  *pExpr = pWC->a[
1e150 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
1e160 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e        if( &pWC->
1e170 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72  a[iTerm] == pTer
1e180 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  m ) continue;.  
1e190 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1e1a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e1b0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
1e1c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e1d0 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65    if( pWC->a[iTe
1e1e0 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
1e1f0 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f  ERM_ORINFO) ) co
1e200 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e210 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
1e220 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
1e230 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
1e240 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  inue;.        pE
1e250 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1e260 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
1e270 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  0);.        pAnd
1e280 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1e290 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78  prAnd(db, pAndEx
1e2a0 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
1e2b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41    }.      if( pA
1e2c0 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
1e2d0 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
1e2e0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1e2f0 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e  , TK_AND, 0, pAn
1e300 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  dExpr, 0);.     
1e310 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
1e320 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
1e330 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
1e340 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1e350 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
1e360 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
1e370 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
1e380 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
1e390 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
1e3a0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
1e3b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
1e3c0 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
1e3d0 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  o;          /* I
1e3e0 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
1e3f0 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
1e400 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
1e410 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
1e420 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
1e430 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21  f( pAndExpr && !
1e440 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e450 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  pOrExpr, EP_From
1e460 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1e470 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
1e480 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20  ft = pOrExpr;.  
1e490 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20          pOrExpr 
1e4a0 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20  = pAndExpr;.    
1e4b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
1e4c0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   Loop through ta
1e4d0 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
1e4e0 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
1e4f0 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
1e500 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69  pSubWInfo = sqli
1e510 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1e520 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f  arse, pOrTab, pO
1e530 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20  rExpr, 0, 0,.   
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f       WHERE_OMIT_
1e560 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45  OPEN_CLOSE | WHE
1e570 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20  RE_AND_ONLY |.  
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43        WHERE_FORC
1e5a0 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f  E_TABLE | WHERE_
1e5b0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69  ONETABLE_ONLY, i
1e5c0 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20  CovCur);.       
1e5d0 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
1e5e0 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  fo || pParse->nE
1e5f0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1e600 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1e610 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20    if( pSubWInfo 
1e620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
1e630 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70  reLoop *pSubLoop
1e640 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
1e650 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
1e660 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1e670 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
1e680 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
1e690 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
1e6a0 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
1e6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e6c0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1e6d0 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
1e6e0 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
1e6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1e700 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
1e710 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
1e720 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
1e730 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
1e740 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
1e750 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1e760 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
1e770 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
1e780 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e7b0 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
1e7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e7d0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1e7e0 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
1e7f0 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e810 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e820 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1e830 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
1e840 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e870 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
1e880 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
1e890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e8a0 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
1e8b0 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
1e8c0 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
1e8d0 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
1e8e0 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
1e8f0 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
1e900 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
1e910 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
1e920 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
1e930 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
1e940 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
1e950 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
1e960 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
1e970 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
1e980 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
1e990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e9a0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
1e9b0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
1e9c0 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
1e9d0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
1e9e0 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
1e9f0 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
1ea00 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
1ea10 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
1ea20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1ea30 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
1ea40 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
1ea50 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
1ea60 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
1ea70 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
1ea80 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
1ea90 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
1eaa0 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
1eab0 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
1eac0 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
1ead0 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
1eae0 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1eaf0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
1eb00 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
1eb10 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
1eb20 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1eb30 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
1eb40 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
1eb50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
1eb60 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
1eb70 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
1eb80 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
1eb90 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
1eba0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
1ebb0 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
1ebc0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
1ebd0 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
1ebe0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1ebf0 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
1ec00 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
1ec10 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
1ec20 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
1ec30 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
1ec40 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
1ec50 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1ec60 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
1ec70 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
1ec80 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
1ec90 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
1eca0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ecb0 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
1ecc0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
1ecd0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
1ece0 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
1ecf0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1ed00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
1ed10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1ed20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
1ed30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ed40 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
1ed50 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
1ed60 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
1ed70 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
1ed80 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ov).          ){
1ed90 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1eda0 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e  ert( pSubWInfo->
1edb0 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43  a[0].iIdxCur==iC
1edc0 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
1edd0 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62       pCov = pSub
1ede0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1edf0 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
1ee00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ee10 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20     pCov = 0;.   
1ee20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1ee30 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
1ee40 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
1ee50 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
1ee60 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
1ee70 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
1ee80 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1ee90 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
1eea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1eeb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1eec0 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70  l->u.pCovidx = p
1eed0 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  Cov;.    if( pCo
1eee0 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  v ) pLevel->iIdx
1eef0 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20  Cur = iCovCur;. 
1ef00 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
1ef10 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70  ){.      pAndExp
1ef20 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
1ef30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1ef40 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78  elete(db, pAndEx
1ef50 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  pr);.    }.    s
1ef60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1ef70 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20  P1(v, iRetInit, 
1ef80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1ef90 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
1efa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1efb0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1efc0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1efd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1efe0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1eff0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
1f000 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
1f010 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
1f020 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
1f030 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
1f040 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
1f050 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1f060 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
1f070 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1f080 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
1f090 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
1f0a0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36   {.    /* Case 6
1f0b0 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
1f0c0 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
1f0d0 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
1f0e0 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
1f0f0 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
1f100 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
1f110 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
1f120 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
1f130 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
1f140 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
1f150 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1f160 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
1f170 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
1f180 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
1f190 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
1f1a0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  ;.    if( pTabIt
1f1b0 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  em->isRecursive 
1f1c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ){.      /* Tabl
1f1d0 65 73 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75  es marked isRecu
1f1e0 72 73 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20  rsive have only 
1f1f0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61  a single row tha
1f200 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20  t is stored in. 
1f210 20 20 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f       ** a pseudo
1f220 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65  -cursor.  No nee
1f230 64 20 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e  d to Rewind or N
1f240 65 78 74 20 73 75 63 68 20 63 75 72 73 6f 72 73  ext such cursors
1f250 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65  . */.      pLeve
1f260 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
1f270 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f280 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
1f290 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
1f2a0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1f2b0 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
1f2c0 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
1f2d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f2e0 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
1f2f0 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
1f300 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
1f310 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
1f320 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
1f330 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  P;.    }.  }..  
1f340 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
1f350 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
1f360 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1f370 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
1f380 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  y.  ** computed 
1f390 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
1f3a0 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
1f3b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
1f3c0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
1f3d0 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
1f3e0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
1f3f0 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65  Expr *pE;.    te
1f400 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1f410 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1f420 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73  RTUAL );.    tes
1f430 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1f440 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1f450 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ED );.    if( pT
1f460 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
1f470 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
1f480 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
1f490 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
1f4a0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
1f4b0 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
1f4c0 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
1f4d0 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
1f4e0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
1f4f0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1f500 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1f510 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1f520 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
1f530 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
1f540 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
1f550 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
1f560 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1f570 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
1f580 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1f590 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
1f5a0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1f5b0 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
1f5c0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
1f5d0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1f5e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1f5f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f600 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1f610 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
1f620 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1f630 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
1f640 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
1f650 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  D;.  }..  /* Ins
1f660 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
1f670 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e   for implied con
1f680 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f  straints based o
1f690 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20  n transitivity. 
1f6a0 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20   ** of the "==" 
1f6b0 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
1f6c0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20   ** Example: If 
1f6d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1f6e0 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d   contains "t1.a=
1f6f0 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d  t2.b" and "t2.b=
1f700 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65  123".  ** and we
1f710 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20   are coding the 
1f720 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  t1 loop and the 
1f730 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20  t2 loop has not 
1f740 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20  yet coded,.  ** 
1f750 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75  then we cannot u
1f760 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e  se the "t1.a=t2.
1f770 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62  b" constraint, b
1f780 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20  ut we can code. 
1f790 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20   ** the implied 
1f7a0 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74  "t1.a=123" const
1f7b0 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
1f7c0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
1f7d0 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
1f7e0 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
1f7f0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20  {.    Expr *pE, 
1f800 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72  *pEAlt;.    Wher
1f810 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20  eTerm *pAlt;.   
1f820 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
1f830 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
1f840 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
1f850 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f860 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1f870 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c  ator!=(WO_EQUIV|
1f880 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75  WO_EQ) ) continu
1f890 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
1f8a0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1f8b0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
1f8c0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
1f8d0 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69  LeftJoin ) conti
1f8e0 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54  nue;.    pE = pT
1f8f0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
1f900 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f910 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1f920 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20  FromJoin) );.   
1f930 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
1f940 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
1f950 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
1f960 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20  !=0 );.    pAlt 
1f970 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1f980 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  iCur, pTerm->u.l
1f990 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65  eftColumn, notRe
1f9a0 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
1f9b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41  , 0);.    if( pA
1f9c0 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  lt==0 ) continue
1f9d0 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e  ;.    if( pAlt->
1f9e0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
1f9f0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
1fa00 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
1fa10 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
1fa20 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
1fa30 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
1fa40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1fa50 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64  N );.    VdbeMod
1fa60 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
1fa70 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65  begin transitive
1fa80 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a   constraint"));.
1fa90 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69      pEAlt = sqli
1faa0 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77  te3StackAllocRaw
1fab0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41  (db, sizeof(*pEA
1fac0 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45  lt));.    if( pE
1fad0 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  Alt ){.      *pE
1fae0 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78  Alt = *pAlt->pEx
1faf0 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d  pr;.      pEAlt-
1fb00 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65  >pLeft = pE->pLe
1fb10 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ft;.      sqlite
1fb20 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1fb30 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72  rse, pEAlt, addr
1fb40 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
1fb50 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1fb60 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
1fb70 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20  (db, pEAlt);.   
1fb80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72   }.  }..  /* For
1fb90 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
1fba0 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
1fbb0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
1fbc0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1fbd0 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  .  ** at least o
1fbe0 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
1fbf0 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
1fc00 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
1fc10 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  able.  .  */.  i
1fc20 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
1fc30 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76  Join ){.    pLev
1fc40 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20  el->addrFirst = 
1fc50 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1fc60 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
1fc70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fc80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1fc90 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
1fca0 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
1fcb0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f  omment((v, "reco
1fcc0 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74  rd LEFT JOIN hit
1fcd0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
1fce0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1fcf0 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28  Parse);.    for(
1fd00 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
1fd10 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; j<pWC->nTerm;
1fd20 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
1fd30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fd40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1fd50 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1fd60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fd70 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1fd80 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
1fd90 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1fda0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
1fdb0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
1fdc0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
1fdd0 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
1fde0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
1fdf0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
1fe00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
1fe10 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75  ssert( pWInfo->u
1fe20 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a  ntestedTerms );.
1fe30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1fe40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fe50 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
1fe60 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71  Expr );.      sq
1fe70 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1fe80 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
1fe90 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c  pExpr, addrCont,
1fea0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1feb0 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  LL);.      pTerm
1fec0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
1fed0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
1fee0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1fef0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ff00 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  e, iReleaseReg);
1ff10 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65  ..  return pLeve
1ff20 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a  l->notReady;.}..
1ff30 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
1ff40 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 20  ETRACE_ENABLED) 
1ff50 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1ff60 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1ff70 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1ff80 65 72 61 74 65 20 22 45 78 70 6c 61 6e 61 74 69  erate "Explanati
1ff90 6f 6e 22 20 74 65 78 74 20 66 6f 72 20 61 20 57  on" text for a W
1ffa0 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61  hereTerm..*/.sta
1ffb0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 45 78  tic void whereEx
1ffc0 70 6c 61 69 6e 54 65 72 6d 28 56 64 62 65 20 2a  plainTerm(Vdbe *
1ffd0 76 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  v, WhereTerm *pT
1ffe0 65 72 6d 29 7b 0a 20 20 63 68 61 72 20 7a 54 79  erm){.  char zTy
1fff0 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  pe[4];.  memcpy(
20000 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29  zType, "...", 4)
20010 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77  ;.  if( pTerm->w
20020 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20030 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d  RTUAL ) zType[0]
20040 20 3d 20 27 56 27 3b 0a 20 20 69 66 28 20 70 54   = 'V';.  if( pT
20050 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
20060 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
20070 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 69  pe[1] = 'E';.  i
20080 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
20090 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
200a0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
200b0 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
200c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
200d0 50 72 69 6e 74 66 28 76 2c 20 22 25 73 20 22 2c  Printf(v, "%s ",
200e0 20 7a 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74   zType);.  sqlit
200f0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 76 2c  e3ExplainExpr(v,
20100 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
20110 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57 48 45 52  }.#endif /* WHER
20120 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 26  ETRACE_ENABLED &
20130 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
20140 54 52 45 45 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  TREE_EXPLAIN */.
20150 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
20160 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
20170 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
20180 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
20190 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
201a0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
201b0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
201c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
201d0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
201e0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
201f0 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
20200 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
20210 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
20220 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
20230 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20240 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
20250 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
20260 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
20270 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
20280 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
20290 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
202a0 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
202b0 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202d0 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
202e0 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
202f0 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
20300 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20310 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
20340 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
20350 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
20360 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
20370 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
20380 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
20390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
203a0 6d 65 3b 0a 20 20 20 20 20 69 66 28 20 70 2d 3e  me;.     if( p->
203b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26  u.btree.pIndex &
203c0 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e  & (zName = p->u.
203d0 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
203e0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
203f0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
20400 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
20410 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20  index_", 17)==0 
20420 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
20430 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
20440 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20  30(zName) - 1;. 
20450 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e         while( zN
20460 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d  ame[i]!='_' ) i-
20470 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  -;.        zName
20480 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
20490 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
204a0 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20  gPrintf(".%-16s 
204b0 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e  %2d", zName, p->
204c0 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20  u.btree.nEq);.  
204d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
204e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
204f0 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20  f("%20s","");.  
20500 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
20510 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66   char *z;.    if
20520 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  ( p->u.vtab.idxS
20530 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  tr ){.      z = 
20540 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20550 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22  "(%d,\"%s\",%x)"
20560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20570 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e    p->u.vtab.idxN
20580 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  um, p->u.vtab.id
20590 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xStr, p->u.vtab.
205a0 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
205b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
205c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
205d0 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e  "(%d,%x)", p->u.
205e0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
205f0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
20600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20610 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
20620 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20   %-19s", z);.   
20630 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
20640 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
20650 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
20660 30 34 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  04x N %d", p->ws
20670 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
20680 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
20690 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25  gPrintf(" cost %
206a0 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72  d,%d,%d\n", p->r
206b0 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20  Setup, p->rRun, 
206c0 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 64 65 66  p->nOut);.#ifdef
206d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54   SQLITE_ENABLE_T
206e0 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  REE_EXPLAIN.  /*
206f0 20 49 66 20 74 68 65 20 30 78 31 30 30 20 62 69   If the 0x100 bi
20700 74 20 6f 66 20 77 68 65 72 65 74 72 61 63 69 6e  t of wheretracin
20710 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 73  g is set, then s
20720 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  how all of the c
20730 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 65  onstraint.  ** e
20740 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
20750 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61 4c 54 65  e WhereLoop.aLTe
20760 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20 20 2a 2f  rm[] array..  */
20770 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d  .  if( p->nLTerm
20780 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72   && (sqlite3Wher
20790 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21  eTrace & 0x100)!
207a0 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45 52 45 54  =0 ){  /* WHERET
207b0 52 41 43 45 20 30 78 31 30 30 20 2a 2f 0a 20 20  RACE 0x100 */.  
207c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
207d0 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  e *v = pWInfo->p
207e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
207f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
20800 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f  Begin(v);.    fo
20810 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65  r(i=0; i<p->nLTe
20820 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
20830 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
20840 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b   = p->aLTerm[i];
20850 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
20860 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
20870 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20880 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 20  lainPrintf(v, " 
20890 20 28 25 64 29 20 23 25 2d 32 64 20 22 2c 20 69   (%d) #%-2d ", i
208a0 2b 31 2c 20 28 69 6e 74 29 28 70 54 65 72 6d 2d  +1, (int)(pTerm-
208b0 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20 20  pWC->a));.      
208c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
208d0 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65  sh(v);.      whe
208e0 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c  reExplainTerm(v,
208f0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 73   pTerm);.      s
20900 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
20910 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
20920 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a  e3ExplainNL(v);.
20930 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20940 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76  3ExplainFinish(v
20950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
20960 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
20970 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
20980 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a  nation(v));.  }.
20990 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a  #endif.}.#endif.
209a0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
209b0 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
209c0 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
209d0 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
209e0 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
209f0 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
20a00 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
20a10 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
20a20 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
20a30 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
20a40 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
20a50 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
20a60 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
20a70 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
20a80 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
20a90 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
20aa0 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
20ab0 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
20ac0 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
20ad0 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
20ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20af0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
20b00 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
20b10 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
20b20 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
20b30 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
20b40 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55  ALTABLE|WHERE_AU
20b50 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  TO_INDEX) ){.   
20b60 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
20b70 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
20b80 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
20b90 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
20ba0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20bb0 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
20bc0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
20bd0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
20be0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
20bf0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
20c00 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
20c10 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
20c20 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
20c30 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
20c40 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
20c50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
20c60 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
20c70 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
20c80 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
20c90 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d  3KeyInfoUnref(p-
20ca0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
20cb0 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
20cc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20cd0 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
20ce0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
20cf0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
20d00 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
20d10 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
20d20 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
20d30 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
20d40 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
20d50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
20d60 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
20d70 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
20d80 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
20d90 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
20da0 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
20db0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
20dc0 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
20dd0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
20de0 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
20df0 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
20e00 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
20e10 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
20e20 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
20e30 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
20e40 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
20e50 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
20e60 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
20e70 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
20e80 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
20e90 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
20ea0 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
20eb0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20ec0 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
20ed0 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
20ee0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20ef0 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  w(db, sizeof(p->
20f00 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20  aLTerm[0])*n);. 
20f10 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20   if( paNew==0 ) 
20f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20f30 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  MEM;.  memcpy(pa
20f40 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
20f50 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
20f60 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
20f70 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
20f80 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
20f90 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
20fa0 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
20fb0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
20fc0 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
20fd0 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
20fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20ff0 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
21000 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
21010 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
21020 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
21030 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
21040 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
21050 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
21060 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
21070 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
21080 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
21090 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
210a0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
210b0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
210c0 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
210d0 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
210e0 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
210f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21100 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
21110 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
21120 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
21130 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
21140 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
21150 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
21160 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
21170 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
21180 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
21190 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
211a0 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
211b0 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
211c0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
211d0 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
211e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
211f0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
21200 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
21210 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
21220 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
21230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21240 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
21250 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
21260 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
21270 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
21280 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
21290 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
212a0 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
212b0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
212c0 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
212d0 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
212e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
212f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
21300 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
21310 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
21320 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
21330 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
21340 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
21350 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
21360 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
21370 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
21380 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
21390 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
213a0 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
213b0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
213c0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
213d0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
213e0 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
213f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
21400 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
21410 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
21420 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
21430 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
21440 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
21450 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
21460 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
21470 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
21480 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
21490 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
214a0 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
214b0 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
214c0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
214d0 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
214e0 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
214f0 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
21500 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
21510 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
21520 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
21530 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
21540 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
21550 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
21560 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
21570 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
21580 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
21590 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
215a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
215b0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
215c0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
215d0 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
215e0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
215f0 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
21600 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
21610 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
21620 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
21630 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
21640 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
21650 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
21660 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
21670 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
21680 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
21690 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
216a0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
216b0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
216c0 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
216d0 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
216e0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
216f0 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
21700 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
21710 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
21720 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
21730 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
21740 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  * template is be
21750 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
21760 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
21770 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
21780 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
21790 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
217a0 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
217b0 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
217c0 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
217d0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
217e0 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
217f0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
21800 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
21810 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
21820 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
21830 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
21840 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
21850 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
21860 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
21870 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
21880 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65 6d      (5)  The tem
21890 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20  plate uses more 
218a0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d  terms of the sam
218b0 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73 20  e index but has 
218c0 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  no additional.**
218d0 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64 65           depende
218e0 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20 0a  ncies          .
218f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
21900 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
21910 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
21920 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
21930 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
21940 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
21950 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78  pPrev, *p, *pNex
21960 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e  t = 0;.  WhereIn
21970 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
21980 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
21990 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
219a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
219b0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
219c0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
219d0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
219e0 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
219f0 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
21a00 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
21a10 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
21a20 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23  ->pOrSet!=0 ){.#
21a30 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
21a40 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20  ABLED.    u16 n 
21a50 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
21a60 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78  et->n;.    int x
21a70 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68   =.#endif.    wh
21a80 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69  ereOrInsert(pBui
21a90 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54  lder->pOrSet, pT
21aa0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c  emplate->prereq,
21ab0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
21ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
21af0 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52  >nOut);.#if WHER
21b00 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
21b10 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28  * 0x8 */.    if(
21b20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
21b30 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
21b40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21b50 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64  intf(x?"   or-%d
21b60 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20  :  ":"   or-X:  
21b70 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65  ", n);.      whe
21b80 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
21b90 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
21ba0 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
21bb0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
21bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
21bd0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
21be0 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
21bf0 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74  Loop to overwrit
21c00 65 2c 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65  e, or which take
21c10 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20  s.  ** priority 
21c20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a  over pTemplate..
21c30 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65    */.  for(ppPre
21c40 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  v=&pWInfo->pLoop
21c50 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b  s, p=*ppPrev; p;
21c60 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
21c70 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
21c80 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
21c90 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
21ca0 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
21cb0 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
21cc0 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
21cd0 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
21ce0 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
21cf0 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
21d00 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
21d10 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
21d20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
21d30 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
21d40 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
21d50 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
21d60 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
21d70 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
21d80 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
21d90 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
21da0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
21db0 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
21dc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
21dd0 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
21de0 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
21df0 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
21e00 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
21e10 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
21e20 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
21e30 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
21e40 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
21e50 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
21e60 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
21e70 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
21e80 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
21e90 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
21eb0 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
21ec0 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
21ed0 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
21ee0 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
21ef0 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
21f00 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
21f10 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
21f20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
21f30 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
21f40 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
21f50 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
21f60 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
21f70 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
21f80 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
21f90 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
21fa0 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
21fb0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
21fc0 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  );..    if( (p->
21fd0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
21fe0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e  te->prereq)==p->
21ff0 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70  prereq.     && p
22000 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c  ->rSetup<=pTempl
22010 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20  ate->rSetup.    
22020 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
22030 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20  mplate->rRun.   
22040 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
22050 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20  emplate->nOut.  
22060 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
22070 69 73 20 62 72 61 6e 63 68 20 74 61 6b 65 6e 20  is branch taken 
22080 77 68 65 6e 20 70 20 69 73 20 65 71 75 61 6c 20  when p is equal 
22090 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  or better than p
220a0 54 65 6d 70 6c 61 74 65 20 69 6e 20 0a 20 20 20  Template in .   
220b0 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 28 31 29     ** all of (1)
220c0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 28 32   dependencies (2
220d0 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33  ) setup-cost, (3
220e0 29 20 72 75 6e 2d 63 6f 73 74 2c 20 61 6e 64 0a  ) run-cost, and.
220f0 20 20 20 20 20 20 2a 2a 20 28 34 29 20 6e 75 6d        ** (4) num
22100 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
22110 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ws. */.      ass
22120 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
22130 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
22140 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  p );.      if( p
22150 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c  ->prereq==pTempl
22160 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
22170 20 20 20 26 26 20 70 2d 3e 6e 4c 54 65 72 6d 3c     && p->nLTerm<
22180 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
22190 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e  m.       && (p->
221a0 77 73 46 6c 61 67 73 20 26 20 70 54 65 6d 70 6c  wsFlags & pTempl
221b0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
221c0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
221d0 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 75  .       && (p->u
221e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70  .btree.pIndex==p
221f0 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65  Template->u.btre
22200 65 2e 70 49 6e 64 65 78 0a 20 20 20 20 20 20 20  e.pIndex.       
22210 20 20 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d     || pTemplate-
22220 3e 72 52 75 6e 2b 70 2d 3e 6e 4c 54 65 72 6d 3c  >rRun+p->nLTerm<
22230 3d 70 2d 3e 72 52 75 6e 2b 70 54 65 6d 70 6c 61  =p->rRun+pTempla
22240 74 65 2d 3e 6e 4c 54 65 72 6d 29 0a 20 20 20 20  te->nLTerm).    
22250 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
22260 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
22270 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
22280 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20  with an similar 
22290 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20  one that uses.  
222a0 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65        ** more te
222b0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
222c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
222d0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
222e0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
222f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22300 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61        /* pTempla
22310 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  te is not helpfu
22320 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  l..        ** Re
22330 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61  turn without cha
22340 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20  nging or adding 
22350 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  anything */.    
22360 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
22370 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20  opInsert_noop;. 
22380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22390 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
223a0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
223b0 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
223c0 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20  >prereq.     && 
223d0 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61  p->rRun>=pTempla
223e0 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26  te->rRun.     &&
223f0 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
22400 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b  ate->nOut.    ){
22410 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  .      /* Overwr
22420 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
22430 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
22440 20 62 65 74 74 65 72 20 6f 6e 65 3a 20 6f 6e 65   better one: one
22450 20 74 68 61 74 20 69 73 0a 20 20 20 20 20 20 2a   that is.      *
22460 2a 20 62 65 74 74 65 72 20 61 74 20 6f 6e 65 20  * better at one 
22470 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63  of (1) dependenc
22480 69 65 73 2c 20 28 32 29 20 73 65 74 75 70 2d 63  ies, (2) setup-c
22490 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73  ost, (3) run-cos
224a0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 28 34  t.      ** or (4
224b0 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  ) number of outp
224c0 75 74 20 72 6f 77 73 2c 20 61 6e 64 20 69 73 20  ut rows, and is 
224d0 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20  no worse in any 
224e0 6f 66 20 74 68 6f 73 65 0a 20 20 20 20 20 20 2a  of those.      *
224f0 2a 20 63 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f  * categories. */
22500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22510 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
22520 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f  ate->rSetup ); /
22530 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  * SETUP-INVARIAN
22540 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20  T above */.     
22550 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
22560 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 62 72 65  tLoop;.      bre
22570 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
22580 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
22590 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
225a0 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
225b0 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
225c0 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
225d0 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
225e0 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
225f0 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
22600 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
22610 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
22620 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
22630 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
22640 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
22650 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
22660 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
22670 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
22680 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
22690 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
226a0 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20  ins-del:  ");.  
226b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
226c0 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
226d0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pWC);.    }.    
226e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
226f0 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29  tf("ins-new:  ")
22700 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
22710 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
22720 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
22730 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
22740 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d   p==0 ){.    p =
22750 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22760 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  Raw(db, sizeof(W
22770 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
22780 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
22790 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
227a0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69      whereLoopIni
227b0 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72  t(p);.  }.  wher
227c0 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c  eLoopXfer(db, p,
227d0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70   pTemplate);.  p
227e0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e  ->pNextLoop = pN
227f0 65 78 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d  ext;.  *ppPrev =
22800 20 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73   p;.  if( (p->ws
22810 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
22820 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
22830 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
22840 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
22850 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
22860 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
22870 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
22880 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
22890 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
228a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
228b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
228c0 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
228d0 69 6e 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f  insert is a no-o
228e0 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e  p */.whereLoopIn
228f0 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57  sert_noop:.#if W
22900 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
22910 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
22920 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
22930 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
22940 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22950 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22  ntf("ins-noop: "
22960 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
22970 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
22980 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
22990 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
229a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
229b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73   .}../*.** Adjus
229c0 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  t the WhereLoop.
229d0 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77  nOut value downw
229e0 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ard to account f
229f0 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  or terms of the.
22a00 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
22a10 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
22a20 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63  he loop but whic
22a30 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62  h are not used b
22a40 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  y an.** index..*
22a50 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72  *.** In the curr
22a60 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
22a70 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20 65 78  on, the first ex
22a80 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  tra WHERE clause
22a90 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a   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 61 20  utput rows by a 
22ac0 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61 6e 64  factor of 10 and
22ad0 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
22ae0 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73   term.** reduces
22af0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
22b00 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 73 71  utput rows by sq
22b10 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt(2)..*/.static
22b20 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f   void whereLoopO
22b30 75 74 70 75 74 41 64 6a 75 73 74 28 57 68 65 72  utputAdjust(Wher
22b40 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 57 68  eClause *pWC, Wh
22b50 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b  ereLoop *pLoop){
22b60 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
22b70 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
22b80 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
22b90 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
22ba0 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
22bb0 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  );.  int i, j;..
22bc0 20 20 69 66 28 20 21 4f 70 74 69 6d 69 7a 61 74    if( !Optimizat
22bd0 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 43 2d 3e  ionEnabled(pWC->
22be0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
22bf0 64 62 2c 20 53 51 4c 49 54 45 5f 41 64 6a 75 73  db, SQLITE_Adjus
22c00 74 4f 75 74 45 73 74 29 20 29 7b 0a 20 20 20 20  tOutEst) ){.    
22c10 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
22c20 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
22c30 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
22c40 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
22c50 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
22c60 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
22c70 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
22c80 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
22c90 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
22ca0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
22cb0 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
22cc0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
22cd0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
22ce0 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
22cf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
22d00 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
22d10 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
22d20 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
22d30 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
22d40 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
22d50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
22d60 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
22d70 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
22d80 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
22d90 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
22da0 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
22db0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
22dc0 20 20 20 69 66 28 20 6a 3c 30 20 29 20 70 4c 6f     if( j<0 ) pLo
22dd0 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
22de0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
22df0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  }.}../*.** We ha
22e00 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
22e10 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
22e20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
22e30 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
22e40 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20   pIndex..** Try 
22e50 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
22e60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  e..**.** If pPro
22e70 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
22e80 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
22e90 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
22ea0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
22eb0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
22ec0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
22ed0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
22ee0 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
22ef0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
22f00 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
22f10 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
22f20 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
22f30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
22f40 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
22f50 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
22f60 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
22f70 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
22fa0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
22fb0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
22fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
22fd0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
22fe0 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
22ff0 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
23000 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
23010 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
23020 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
23030 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
23040 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
23050 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
23060 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
23070 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
23080 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23090 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
230a0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
230b0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
230c0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
230d0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
230e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
230f0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
23100 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
23110 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
23120 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
23130 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
23140 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
23150 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
23160 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23180 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
23190 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
231a0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
231b0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
231c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
231d0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
231e0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
231f0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
23200 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
23210 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
23220 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
23230 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23250 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
23260 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
23270 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
23280 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
23290 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
232a0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
232b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
232c0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
232d0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
232e0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
232f0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
23300 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20  tree.nSkip */.  
23310 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
23320 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
23330 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
23340 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
23350 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
23360 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
23370 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
23380 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
23390 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
233a0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233c0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
233d0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
233e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
233f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
23400 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
23410 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
23420 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   nRowEst;       
23430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
23440 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c  imated index sel
23450 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 4c 6f  ectivity */.  Lo
23460 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23480 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
23490 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
234a0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
234b0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
234c0 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
234d0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
234e0 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
234f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
23500 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23510 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
23520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
23530 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
23540 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
23550 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
23560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
23570 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
23580 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
23590 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
235a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
235b0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
235c0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
235d0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
235e0 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
235f0 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f  <=0 || (pSrc->jo
23600 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
23610 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
23620 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
23630 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
23640 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
23650 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
23660 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
23670 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47  SNULL|WO_GT|WO_G
23680 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
23690 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
236a0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
236b0 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
236c0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
236d0 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
236e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
236f0 3c 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  <=pProbe->nKeyCo
23700 6c 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  l );.  if( pNew-
23710 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70  >u.btree.nEq < p
23720 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Probe->nKeyCol )
23730 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72  {.    iCol = pPr
23740 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
23750 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
23760 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20  ;.    nRowEst = 
23770 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 50  sqlite3LogEst(pP
23780 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70  robe->aiRowEst[p
23790 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
237a0 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  +1]);.    if( nR
237b0 6f 77 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f  owEst==0 && pPro
237c0 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  be->onError==OE_
237d0 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d  None ) nRowEst =
237e0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
237f0 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
23800 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d  nRowEst = 0;.  }
23810 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
23820 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
23830 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
23840 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43  Src->iCursor, iC
23850 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
23860 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61              opMa
23870 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73  sk, pProbe);.  s
23880 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d  aved_nEq = pNew-
23890 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
238a0 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e  saved_nSkip = pN
238b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
238c0 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72  p;.  saved_nLTer
238d0 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  m = pNew->nLTerm
238e0 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67  ;.  saved_wsFlag
238f0 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  s = pNew->wsFlag
23900 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65  s;.  saved_prere
23910 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  q = pNew->prereq
23920 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d  ;.  saved_nOut =
23930 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70   pNew->nOut;.  p
23940 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
23950 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
23960 74 4c 6f 67 28 73 71 6c 69 74 65 33 4c 6f 67 45  tLog(sqlite3LogE
23970 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  st(pProbe->aiRow
23980 45 73 74 5b 30 5d 29 29 3b 0a 0a 20 20 2f 2a 20  Est[0]));..  /* 
23990 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
239a0 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
239b0 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
239c0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
239d0 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
239e0 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
239f0 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
23a00 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
23a10 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
23a20 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
23a30 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
23a40 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
23a50 6c 65 61 73 74 20 31 38 2e 20 20 54 68 65 20 6d  least 18.  The m
23a60 61 67 69 63 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  agic.  ** number
23a70 20 31 38 20 77 61 73 20 66 6f 75 6e 64 20 62 79   18 was found by
23a80 20 65 78 70 65 72 69 6d 65 6e 74 61 74 69 6f 6e   experimentation
23a90 20 74 6f 20 62 65 20 74 68 65 20 70 61 79 6f 66   to be the payof
23aa0 66 20 70 6f 69 6e 74 20 77 68 65 72 65 0a 20 20  f point where.  
23ab0 2a 2a 20 73 6b 69 70 2d 73 63 61 6e 20 62 65 63  ** skip-scan bec
23ac0 6f 6d 65 20 66 61 73 74 65 72 20 74 68 61 6e 20  ome faster than 
23ad0 61 20 66 75 6c 6c 2d 73 63 61 6e 2e 0a 20 20 2a  a full-scan..  *
23ae0 2f 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  /.  if( pTerm==0
23af0 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71  .   && saved_nEq
23b00 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20  ==saved_nSkip.  
23b10 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c   && saved_nEq+1<
23b20 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a  pProbe->nKeyCol.
23b30 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
23b40 52 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  RowEst[saved_nEq
23b50 2b 31 5d 3e 3d 31 38 20 20 2f 2a 20 54 55 4e 49  +1]>=18  /* TUNI
23b60 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20  NG: Minimum for 
23b70 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20  skip-scan */.   
23b80 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f  && (rc = whereLo
23b90 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
23ba0 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
23bb0 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  1))==SQLITE_OK. 
23bc0 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e   ){.    LogEst n
23bd0 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Iter;.    pNew->
23be0 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
23bf0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
23c00 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e  .nSkip++;.    pN
23c10 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
23c20 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a  >nLTerm++] = 0;.
23c30 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
23c40 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53  s |= WHERE_SKIPS
23c50 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d  CAN;.    nIter =
23c60 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
23c70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
23c80 30 5d 2f 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  0]/pProbe->aiRow
23c90 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
23ca0 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
23cb0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
23cc0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
23cd0 72 6f 62 65 2c 20 6e 49 74 65 72 29 3b 0a 20 20  robe, nIter);.  
23ce0 7d 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  }.  for(; rc==SQ
23cf0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
23d00 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65  !=0; pTerm = whe
23d10 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
23d20 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20  )){.    int nIn 
23d30 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
23d40 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
23d50 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
23d60 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
23d70 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
23d80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
23d90 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
23da0 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  or==WO_ISNULL ||
23db0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
23dc0 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
23dd0 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30  .     && (iCol<0
23de0 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e   || pSrc->pTab->
23df0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
23e00 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ll).    ){.     
23e10 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
23e20 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
23e30 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
23e40 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
23e50 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
23e60 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
23e70 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
23e80 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
23e90 75 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ue;..    assert(
23ea0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
23eb0 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20  ed_nOut );..    
23ec0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
23ed0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
23ee0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
23ef0 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
23f00 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
23f10 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
23f20 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
23f30 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
23f40 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
23f50 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
23f60 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
23f70 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
23f80 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
23f90 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
23fa0 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
23fb0 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
23fc0 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
23fd0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
23fe0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f  pNew->rRun = rLo
23ff0 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69  gSize; /* Baseli
24000 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28  ne cost is log2(
24010 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73  N).  Adjustments
24020 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66   below */.    if
24030 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24040 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
24050 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
24060 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
24070 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
24080 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
24090 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
240a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
240b0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
240c0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
240d0 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
240e0 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
240f0 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
24100 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
24110 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
24120 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
24130 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
24140 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
24150 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
24160 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
24170 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
24180 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
24190 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
241a0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
241b0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
241c0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
241d0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
241e0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
241f0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
24200 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77   nIn;.      pNew
24210 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
24220 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
24230 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
24240 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
24250 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
24260 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
24270 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73  _EQ) ){.      as
24280 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 28 70  sert(.        (p
24290 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
242a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
242b0 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  L|WHERE_COLUMN_I
242c0 4e 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  N|WHERE_SKIPSCAN
242d0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c  ))!=0.        ||
242e0 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
242f0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
24300 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
24310 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
24320 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
24330 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e  (nInMul==0 && pN
24340 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
24350 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
24360 2d 31 29 29 7b 0a 20 20 20 20 20 20 20 20 61 73  -1)){.        as
24370 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
24380 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
24390 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43  UMN_IN)==0 || iC
243a0 6f 6c 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol<0 );.        
243b0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
243c0 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Probe->onError==
243d0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20  OE_None ){.     
243e0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
243f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f  gs |= WHERE_UNQ_
24400 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20  WANTED;.        
24410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24420 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
24430 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
24440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24450 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  }.      pNew->u.
24460 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
24470 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24480 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
24490 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
244a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
244b0 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29   & (WO_ISNULL) )
244c0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
244d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
244e0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
244f0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
24500 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20  nEq++;.      /* 
24510 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20  TUNING: IS NULL 
24520 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a  selects 2 rows *
24530 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30  /.      nIn = 10
24540 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73  ;  assert( 10==s
24550 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
24560 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
24570 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
24580 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
24590 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
245a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
245b0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
245c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
245d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
245e0 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20   & WO_GT );.    
245f0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24600 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24610 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_GE );.      pN
24620 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
24630 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
24640 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  E|WHERE_BTM_LIMI
24650 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  T;.      pBtm = 
24660 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f  pTerm;.      pTo
24670 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
24680 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24690 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
246a0 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
246b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
246c0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
246d0 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a  ator & WO_LT );.
246e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
246f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24700 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
24710 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
24720 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
24730 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
24740 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f  LIMIT;.      pTo
24750 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
24760 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
24770 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
24780 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
247b0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
247c0 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 0;.    }.    
247d0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
247e0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
247f0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
24800 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61  /* Adjust nOut a
24810 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54  nd rRun for STAT
24820 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a  3 range values *
24830 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
24840 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
24850 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  d_nOut );.      
24860 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
24870 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
24880 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
24890 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69 66  pNew);.    }.#if
248a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
248b0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
248c0 0a 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d  .    if( nInMul=
248d0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 72 6f  =0 .     && pPro
248e0 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
248f0 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
24900 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
24910 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
24920 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
24930 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
24940 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20 29 7b  E_Stat3) .    ){
24950 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
24960 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
24970 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  r;.      tRowcnt
24980 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
24990 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
249a0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
249b0 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29  WO_ISNULL))!=0 )
249c0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
249d0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
249e0 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
249f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24a00 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24a10 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
24a20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
24a30 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
24a40 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
24a50 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
24a60 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
24a70 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
24a80 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
24a90 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  _IN).           
24aa0 20 20 26 26 20 20 21 45 78 70 72 48 61 73 50 72    &&  !ExprHasPr
24ab0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24ac0 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a  _xIsSelect)  ){.
24ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
24ae0 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
24af0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
24b00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
24b10 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
24b20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74      assert( nOut
24b30 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
24b40 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
24b50 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
24b60 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
24b70 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
24b80 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
24b90 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
24ba0 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
24bb0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
24bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
24bd0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
24be0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
24bf0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
24c00 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
24c10 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
24c20 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
24c30 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
24c40 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
24c50 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
24c60 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
24c70 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
24c80 72 52 75 6e 20 3d 20 20 73 71 6c 69 74 65 33 4c  rRun =  sqlite3L
24c90 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
24ca0 52 75 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32 37 20  Run,rLogSize>27 
24cb0 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20  ? rLogSize-17 : 
24cc0 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  10);.    }.    /
24cd0 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20  * Step cost for 
24ce0 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20  each output row 
24cf0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  */.    pNew->rRu
24d00 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
24d10 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
24d20 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20   pNew->nOut);.  
24d30 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
24d40 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
24d50 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20  ->pWC, pNew);.  
24d60 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
24d70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
24d80 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
24d90 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
24da0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
24db0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
24dc0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28  w->u.btree.nEq<(
24dd0 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20  pProbe->nKeyCol 
24de0 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  + (pProbe->zName
24df0 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  !=0)).    ){.   
24e00 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
24e10 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
24e20 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
24e30 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
24e40 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
24e50 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
24e60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
24e70 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
24e80 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64  STAT4.    pBuild
24e90 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
24ea0 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
24eb0 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72  f.  }.  pNew->pr
24ec0 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65  ereq = saved_pre
24ed0 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  req;.  pNew->u.b
24ee0 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
24ef0 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  _nEq;.  pNew->u.
24f00 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73 61  btree.nSkip = sa
24f10 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
24f20 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
24f30 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
24f40 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
24f50 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
24f60 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
24f70 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72  Term;.  return r
24f80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
24f90 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
24fa0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
24fb0 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
24fc0 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
24fd0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
24fe0 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
24ff0 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
25000 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
25010 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
25020 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
25030 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
25040 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
25050 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
25060 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
25070 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
25080 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
25090 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
250a0 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
250b0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
250c0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
250d0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
250e0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
250f0 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
25100 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
25110 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a  .  int ii, jj;..
25120 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55    if( pIndex->bU
25130 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72  nordered ) retur
25140 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20  n 0;.  if( (pOB 
25150 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
25160 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30  fo->pOrderBy)==0
25170 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
25180 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
25190 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
251a0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
251b0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
251c0 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
251d0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
251e0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
251f0 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
25200 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   0;.    if( pExp
25210 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73  r->iTable==iCurs
25220 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  or ){.      for(
25230 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
25240 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
25250 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
25260 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
25270 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
25280 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
25290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
252a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
252b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69  *.** Return a bi
252c0 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69  tmask where 1s i
252d0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
252e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
252f0 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
25300 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79  table is used by
25310 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79   an index.  Only
25320 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
25330 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  lumns are consid
25340 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
25350 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49  Bitmask columnsI
25360 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  nIndex(Index *pI
25370 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  dx){.  Bitmask m
25380 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
25390 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f   for(j=pIdx->nCo
253a0 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  lumn-1; j>=0; j-
253b0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  -){.    int x = 
253c0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
253d0 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20  ];.    if( x>=0 
253e0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
253f0 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
25400 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
25410 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
25420 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d   if( x<BMS-1 ) m
25430 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a   |= MASKBIT(x);.
25440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25450 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63  rn m;.}../* Chec
25460 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61  k to see if a pa
25470 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68  rtial index with
25480 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65   pPartIndexWhere
25490 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
254a0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  in the current q
254b0 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72  uery.  Return tr
254c0 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20  ue if it can be 
254d0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
254e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
254f0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
25500 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62  alIndex(int iTab
25510 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
25520 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65  WC, Expr *pWhere
25530 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
25540 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
25550 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
25560 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
25570 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
25580 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  m++){.    if( sq
25590 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
255a0 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70  Expr(pTerm->pExp
255b0 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29  r, pWhere, iTab)
255c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
255d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
255e0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
255f0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
25600 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62  for a single tab
25610 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77  le of the join w
25620 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a  here the table.*
25630 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79  * is idenfied by
25640 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
25650 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
25660 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
25670 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
25680 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
25690 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
256a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
256b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a  reLoopAddBtree(.
256c0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
256d0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a  er *pBuilder, /*
256e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
256f0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
25700 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20  itmask mExtra   
25710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
25720 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65  tra prerequesite
25730 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73  s for using this
25740 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57   table */.){.  W
25750 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
25760 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48  ;          /* WH
25770 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
25780 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
25790 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
257a0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
257b0 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
257c0 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73  ing */.  Index s
257d0 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
257e0 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69       /* A fake i
257f0 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
25800 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
25810 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52  */.  tRowcnt aiR
25820 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
25830 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74   /* The aiRowEst
25840 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
25850 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
25860 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
25870 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
25880 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
25890 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
258a0 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
258b0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
258c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
258d0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
258e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
258f0 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
25900 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
25910 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
25920 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
25930 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
25940 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
25950 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
25960 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25970 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
25980 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25990 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
259a0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
259b0 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
259c0 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
259e0 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
259f0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
25a00 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
25a10 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
25a20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
25a30 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
25a40 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
25a50 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
25a60 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
25a70 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
25a80 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
25a90 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
25aa0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
25ab0 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
25ac0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ae0 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
25af0 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
25b00 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
25b10 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
25b20 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
25b30 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
25b40 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
25b50 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
25b60 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
25b70 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
25b80 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
25b90 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
25ba0 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
25bb0 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
25bc0 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
25bd0 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
25be0 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
25bf0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
25c00 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
25c10 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
25c20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
25c30 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
25c40 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
25c50 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
25c60 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
25c70 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
25c80 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
25c90 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
25ca0 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
25cb0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
25cc0 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
25cd0 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
25ce0 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
25cf0 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
25d00 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
25d10 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
25d20 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
25d30 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
25d40 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
25d50 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
25d60 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
25d70 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
25d80 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25da0 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
25db0 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
25dc0 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
25dd0 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
25de0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
25df0 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
25e00 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
25e10 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
25e20 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74      sPk.aiRowEst
25e30 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
25e40 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
25e50 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
25e60 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54   sPk.pTable = pT
25e70 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ab;.    aiRowEst
25e80 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52  Pk[0] = pTab->nR
25e90 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
25ea0 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
25eb0 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
25ec0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
25ed0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
25ee0 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
25ef0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
25f00 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
25f10 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
25f20 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
25f30 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
25f40 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
25f50 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
25f60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
25f70 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
25f80 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
25f90 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
25fa0 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
25fb0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
25fc0 28 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b  (pTab->nRowEst);
25fd0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
25fe0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
25ff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26000 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
26010 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
26020 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
26030 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
26040 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66  Set.   && (pWInf
26050 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
26060 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
26070 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
26080 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d  & pSrc->pIndex==
26090 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76  0.   && !pSrc->v
260a0 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26  iaCoroutine.   &
260b0 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  & !pSrc->notInde
260c0 78 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77  xed.   && HasRow
260d0 69 64 28 70 54 61 62 29 0a 20 20 20 26 26 20 21  id(pTab).   && !
260e0 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
260f0 65 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ed.   && !pSrc->
26100 69 73 52 65 63 75 72 73 69 76 65 0a 20 20 29 7b  isRecursive.  ){
26110 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
26120 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
26130 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
26140 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
26150 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
26160 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
26170 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
26180 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
26190 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
261a0 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
261b0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
261c0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
261d0 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
261e0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
261f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
26200 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
26210 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
26220 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
26230 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
26240 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
26250 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
26260 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
26270 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
26280 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
26290 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
262a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
262b0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
262c0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
262d0 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f  ING: One-time co
262e0 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67  st for computing
262f0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
26300 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20  ndex is.        
26310 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79  ** approximately
26320 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65   7*N*log2(N) whe
26330 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
26340 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20  er of rows in.  
26350 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
26360 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
26370 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
26380 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67  w->rSetup = rLog
26390 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 32  Size + rSize + 2
263a0 38 3b 20 20 61 73 73 65 72 74 28 20 32 38 3d 3d  8;  assert( 28==
263b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 37 29  sqlite3LogEst(7)
263c0 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
263d0 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
263e0 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
263f0 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
26400 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
26410 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
26420 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
26430 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
26440 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
26450 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
26460 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20  of knowning how 
26470 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e  selective the in
26480 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  dex will ultimat
26490 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c  ely be.  It woul
264a0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  d.        ** not
264b0 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65   be unreasonable
264c0 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61   to make this va
264d0 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e  lue much larger.
264e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
264f0 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73  ->nOut = 43;  as
26500 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65  sert( 43==sqlite
26510 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20  3LogEst(20) );. 
26520 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
26530 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
26540 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e  tAdd(rLogSize,pN
26550 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  ew->nOut);.     
26560 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
26570 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   = WHERE_AUTO_IN
26580 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
26590 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
265a0 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  ra | pTerm->prer
265b0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
265c0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
265d0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
265e0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
265f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
26600 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
26610 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
26620 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  /..  /* Loop ove
26630 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20  r all indices.  
26640 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  */.  for(; rc==S
26650 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f  QLITE_OK && pPro
26660 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
26670 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49  e->pNext, iSortI
26680 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  dx++){.    if( p
26690 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
266a0 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20  here!=0.     && 
266b0 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74  !whereUsablePart
266c0 69 61 6c 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69  ialIndex(pNew->i
266d0 54 61 62 2c 20 70 57 43 2c 20 70 50 72 6f 62 65  Tab, pWC, pProbe
266e0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
266f0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
26700 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
26710 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
26720 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
26730 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
26740 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
26750 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  q = 0;.    pNew-
26760 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d  >u.btree.nSkip =
26770 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c   0;.    pNew->nL
26780 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Term = 0;.    pN
26790 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
267a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74  ;.    pNew->rSet
267b0 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  up = 0;.    pNew
267c0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
267d0 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  a;.    pNew->nOu
267e0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70  t = rSize;.    p
267f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
26800 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
26810 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
26820 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
26830 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
26840 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
26850 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
26860 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
26870 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
26880 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
26890 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
268a0 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
268b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
268c0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
268d0 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
268e0 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
268f0 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
26900 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
26910 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
26920 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
26930 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
26940 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
26950 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
26960 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
26970 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
26980 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
26990 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
269a0 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
269b0 6e 20 69 73 20 33 2a 28 4e 20 2b 20 6c 6f 67 32  n is 3*(N + log2
269c0 28 4e 29 29 2e 0a 20 20 20 20 20 20 2a 2a 20 20  (N))..      **  
269d0 2b 20 20 54 68 65 20 65 78 74 72 61 20 33 20 66  +  The extra 3 f
269e0 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f  actor is to enco
269f0 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66  urage the use of
26a00 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73   indexed lookups
26a10 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76  .      **     ov
26a20 65 72 20 66 75 6c 6c 20 73 63 61 6e 73 2e 20 20  er full scans.  
26a30 46 49 58 4d 45 20 2a 2f 0a 20 20 20 20 20 20 70  FIXME */.      p
26a40 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
26a50 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 53 69  te3LogEstAdd(rSi
26a60 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31  ze,rLogSize) + 1
26a70 36 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  6;.      whereLo
26a80 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
26a90 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  WC, pNew);.     
26aa0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
26ab0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
26ac0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
26ad0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
26ae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
26af0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
26b00 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
26b10 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
26b20 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
26b30 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
26b40 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
26b50 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
26b60 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
26b70 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
26b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
26b90 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
26ba0 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
26bb0 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
26bc0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
26bd0 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
26be0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
26bf0 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
26c00 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
26c10 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
26c20 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
26c30 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
26c40 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
26c50 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
26c60 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
26c70 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
26c80 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
26c90 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
26ca0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
26cb0 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
26cc0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
26cd0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
26ce0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
26cf0 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
26d00 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
26d10 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
26d20 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
26d30 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
26d40 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
26d50 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
26d60 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
26d70 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
26d80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
26d90 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
26da0 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
26db0 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20    if( m==0 ){.  
26dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
26dd0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76  G: Cost of a cov
26de0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
26df0 20 69 73 20 4b 2a 28 4e 20 2b 20 6c 6f 67 32 28   is K*(N + log2(
26e00 4e 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  N))..          *
26e10 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20  *  +  The extra 
26e20 66 61 63 74 6f 72 20 4b 20 6f 66 20 62 65 74 77  factor K of betw
26e30 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20  een 1.1 and 3.0 
26e40 74 68 61 74 20 64 65 70 65 6e 64 73 0a 20 20 20  that depends.   
26e50 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 6e         **     on
26e60 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
26e70 7a 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  zes of the table
26e80 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 2e 20   and the index. 
26e90 20 4b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   K.          ** 
26ea0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 66      is smaller f
26eb0 6f 72 20 73 6d 61 6c 6c 65 72 20 69 6e 64 69 63  or smaller indic
26ec0 65 73 2c 20 74 68 75 73 20 66 61 76 6f 72 69 6e  es, thus favorin
26ed0 67 20 74 68 65 6d 2e 0a 20 20 20 20 20 20 20 20  g them..        
26ee0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
26ef0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
26f00 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 53 69  te3LogEstAdd(rSi
26f10 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31  ze,rLogSize) + 1
26f20 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
26f30 20 20 20 20 20 20 20 20 20 20 20 28 31 35 2a 70             (15*p
26f40 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
26f50 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  /pTab->szTabRow;
26f60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
26f80 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73 63 61  ING: Cost of sca
26f90 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65  nning a non-cove
26fa0 72 69 6e 67 20 69 6e 64 65 78 20 69 73 20 28 4e  ring index is (N
26fb0 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20  +1)*log2(N).    
26fc0 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77        ** which w
26fd0 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20  e will simplify 
26fe0 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e  to just N*log2(N
26ff0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  ) */.          p
27000 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
27010 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20  e + rLogSize;.  
27020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27030 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
27040 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29  djust(pWC, pNew)
27050 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
27060 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
27070 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
27080 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
27090 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
270a0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
270b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
270c0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  }..    rc = wher
270d0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
270e0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
270f0 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23  c, pProbe, 0);.#
27100 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
27110 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
27120 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
27130 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
27140 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
27150 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
27160 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
27170 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
27180 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
27190 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
271a0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
271b0 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
271c0 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
271d0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
271e0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
271f0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72  Src->pIndex ) br
27200 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
27210 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
27220 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
27230 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
27240 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
27250 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
27260 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
27270 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
27280 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
27290 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
272a0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
272b0 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
272c0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
272d0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
272e0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
272f0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
27300 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
27310 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
27320 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
27330 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20  mask mExtra.){. 
27340 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
27350 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
27360 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
27370 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
27380 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
27390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
273a0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
273b0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
273c0 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
273d0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
273e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
273f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27400 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
27410 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
27420 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
27430 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
27440 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
27450 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
27460 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
27470 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
27480 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
27490 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
274a0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
274b0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
274c0 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
274d0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
274e0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
274f0 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20  iTerm, mxTerm;. 
27500 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
27510 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d  ;.  int seenIn =
27520 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27530 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49   /* True if an I
27540 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65  N operator is se
27550 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  en */.  int seen
27560 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
27570 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
27580 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63  a non-constant c
27590 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65  onstraint is see
275a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73  n */.  int iPhas
275b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
275c0 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20      /* 0: const 
275d0 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74  w/o IN, 1: const
275e0 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20  , 2: no IN,  2: 
275f0 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  IN */.  WhereLoo
27600 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  p *pNew;.  int r
27610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
27620 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
27630 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
27640 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
27650 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
27660 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
27670 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
27680 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
27690 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
276a0 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
276b0 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
276c0 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
276d0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
276e0 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
276f0 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
27700 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
27710 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
27720 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  WC, pSrc, pBuild
27730 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
27740 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
27750 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27760 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e  _NOMEM;.  pNew->
27770 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e  prereq = 0;.  pN
27780 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
27790 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
277a0 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
277b0 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ABLE;.  pNew->nL
277c0 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
277d0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
277e0 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
277f0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
27800 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
27810 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
27820 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
27830 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65  int;.  if( where
27840 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
27850 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
27860 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
27870 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
27880 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nfo);.    return
27890 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
278a0 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65   }..  for(iPhase
278b0 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69  =0; iPhase<=3; i
278c0 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66  Phase++){.    if
278d0 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50  ( !seenIn && (iP
278e0 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20  hase&1)!=0 ){.  
278f0 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20      iPhase++;.  
27900 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33      if( iPhase>3
27910 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
27920 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72      if( !seenVar
27930 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62   && iPhase>1 ) b
27940 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f  reak;.    pIdxCo
27950 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
27960 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
27970 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
27980 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
27990 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
279a0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
279b0 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
279c0 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  Cons++){.      j
279d0 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
279e0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
279f0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
27a00 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  j];.      switch
27a10 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20  ( iPhase ){.    
27a20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f      case 0:    /
27a30 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
27a40 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  out IN operator 
27a50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
27a60 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
27a70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
27a80 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
27a90 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
27aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
27ab0 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  enIn = 1;.      
27ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27ad0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
27ae0 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20  qRight!=0 ){.   
27af0 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72           seenVar
27b00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27b10 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
27b20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27b30 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)==0 ){.     
27b40 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
27b50 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
27b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27b70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27b80 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20    case 1:    /* 
27b90 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49  Constants with I
27ba0 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
27bb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27bc0 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
27bd0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
27be0 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
27bf0 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b  prereqRight==0);
27c00 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
27c10 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
27c20 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
27c30 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
27c40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27c50 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
27c60 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
27c70 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
27c80 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27c90 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
27ca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27cb0 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
27cc0 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
27cd0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
27ce0 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
27cf0 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
27d00 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
27d10 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
27d20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27d30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
27d40 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
27d50 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
27d60 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
27d70 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
27d80 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
27d90 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
27da0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
27db0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
27dc0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
27dd0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
27de0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
27df0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
27e00 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
27e10 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
27e20 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
27e30 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
27e40 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
27e50 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
27e60 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
27e70 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  e)2;.    pIdxInf
27e80 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
27e90 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20   = 25;.    rc = 
27ea0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
27eb0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
27ec0 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
27ed0 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
27ee0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
27ef0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
27f00 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
27f10 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
27f20 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
27f30 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
27f40 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
27f50 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
27f60 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
27f70 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
27f80 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
27f90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
27fa0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
27fb0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
27fc0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
27fd0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
27fe0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
27ff0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
28000 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
28010 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
28020 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
28030 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
28040 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
28050 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
28060 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
28070 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
28080 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
28090 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
280a0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
280b0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
280c0 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
280d0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
280e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
280f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
28100 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
28110 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
28120 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
28130 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
28140 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
28150 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
28160 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
28170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28180 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
28190 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
281a0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
281b0 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
281c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
281d0 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
281e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
281f0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
28200 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
28210 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
28220 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
28230 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
28240 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
28250 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28260 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
28270 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
28280 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
28290 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
282a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
282b0 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
282c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
282d0 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
282e0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
282f0 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
28300 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
28310 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
28320 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
28330 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
28340 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28350 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
28360 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
28370 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
28380 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
28390 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
283a0 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
283b0 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
283c0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
283d0 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
283e0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
283f0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
28400 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
28410 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
28420 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
28430 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
28440 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
28450 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
28460 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
28470 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
28480 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
28490 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
284a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
284b0 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
284c0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
284d0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
284e0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
284f0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
28500 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
28510 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
28520 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
28530 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
28540 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
28550 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
28560 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
28570 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
28580 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
28590 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
285a0 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
285b0 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
285c0 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
285d0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
285e0 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
285f0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
28600 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
28610 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
28620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28630 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72    if( i>=nConstr
28640 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  aint ){.      pN
28650 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
28660 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  erm+1;.      ass
28670 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
28680 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
28690 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  );.      pNew->u
286a0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
286b0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
286c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
286d0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
286e0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
286f0 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20  reeIdxStr;.     
28700 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
28710 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
28720 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
28730 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
28740 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
28750 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
28760 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 75  b.isOrdered = (u
28770 38 29 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  8)((pIdxInfo->nO
28780 72 64 65 72 42 79 21 3d 30 29 0a 20 20 20 20 20  rderBy!=0).     
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287b0 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  && pIdxInfo->ord
287c0 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
287d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
287e0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
287f0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
28800 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c  3LogEstFromDoubl
28810 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  e(pIdxInfo->esti
28820 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20  matedCost);.    
28830 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28840 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
28850 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
28860 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65  Rows);.      whe
28870 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
28880 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
28890 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
288a0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
288b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
288c0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
288d0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
288e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
288f0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
28900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28910 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
28920 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
28930 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
28940 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
28950 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
28960 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
28970 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
28980 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
28990 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
289a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
289b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
289c0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
289d0 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
289e0 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
289f0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
28a00 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
28a10 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
28a20 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
28a30 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
28a40 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
28a50 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
28a60 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
28a70 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
28a80 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
28a90 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
28aa0 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
28ab0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
28ac0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
28ad0 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
28ae0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28af0 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
28b00 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
28b10 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
28b20 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
28b30 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
28b40 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65  sSum, sCur, sPre
28b50 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  v;.  struct SrcL
28b60 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
28b70 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
28b80 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
28b90 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
28ba0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
28bb0 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
28bc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
28bd0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
28be0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
28bf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
28c00 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
28c10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
28c20 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
28c30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
28c40 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
28c50 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
28c60 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 20 72  pItem->pTab) ) r
28c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28c80 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
28c90 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72  >iCursor;..  for
28ca0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
28cb0 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
28cc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
28cd0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
28ce0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
28cf0 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
28d00 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
28d10 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
28d20 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
28d30 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
28d40 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
28d50 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
28d60 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
28d70 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
28d80 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
28d90 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
28da0 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
28db0 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
28dc0 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
28dd0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20       int once = 
28de0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  1;.      int i, 
28df0 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53  j;.    .      sS
28e00 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
28e10 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42  der;.      sSubB
28e20 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20  uild.pOrderBy = 
28e30 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  0;.      sSubBui
28e40 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75  ld.pOrSet = &sCu
28e50 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  r;..      for(pO
28e60 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
28e70 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
28e80 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
28e90 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
28ea0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28eb0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
28ec0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
28ed0 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
28ee0 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
28ef0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
28f00 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
28f10 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
28f20 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
28f30 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
28f40 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
28f50 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
28f60 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
28f70 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
28f80 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
28f90 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
28fa0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
28fb0 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
28fc0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
28fd0 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
28fe0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28ff0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
29000 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
29010 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
29020 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
29030 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
29040 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  BLE.        if( 
29050 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
29060 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
29070 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
29080 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
29090 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
290a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
290b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
290c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
290d0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
290e0 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  e(&sSubBuild, mE
290f0 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
29100 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
29120 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20  | sCur.n==0 );. 
29130 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e         if( sCur.
29140 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
29150 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
29160 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29170 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
29180 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
29190 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
291a0 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20  sSum, &sCur);.  
291b0 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
291c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
291d0 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
291e0 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
291f0 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
29200 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
29210 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
29220 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
29230 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
29240 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
29250 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
29260 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
29270 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
29280 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
29290 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
292c0 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
292d0 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
292e0 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29310 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
29320 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
29330 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
29340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29360 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
29370 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
29380 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
29390 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
293a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
293b0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
293c0 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
293d0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
293e0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
293f0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
29400 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
29410 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
29420 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
29430 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
29440 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
29450 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
29460 54 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70 6c 65  TUNING: Multiple
29470 20 62 79 20 33 2e 35 20 66 6f 72 20 74 68 65 20   by 3.5 for the 
29480 73 65 63 6f 6e 64 61 72 79 20 74 61 62 6c 65 20  secondary table 
29490 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20  lookup */.      
294a0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
294b0 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20  Sum.a[i].rRun + 
294c0 31 38 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  18;.        pNew
294d0 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b  ->nOut = sSum.a[
294e0 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  i].nOut;.       
294f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
29500 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sSum.a[i].prereq
29510 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
29520 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
29530 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
29540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29550 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29560 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
29570 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
29580 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
29590 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
295a0 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
295b0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
295c0 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
295d0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
295e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
295f0 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
29600 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74  Extra = 0;.  Bit
29610 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
29620 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
29630 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
29640 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
29650 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
29660 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
29670 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
29680 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
29690 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61  e->db;.  int nTa
296a0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
296b0 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63  nLevel;.  int rc
296c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
296d0 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  u8 priorJoinType
296e0 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f   = 0;.  WhereLoo
296f0 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c  p *pNew;..  /* L
29700 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
29710 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
29720 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
29730 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ght */.  pNew = 
29740 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
29750 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
29760 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61  pNew);.  for(iTa
29770 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c  b=0, pItem=pTabL
29780 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61  ist->a; iTab<nTa
29790 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70  bList; iTab++, p
297a0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65  Item++){.    pNe
297b0 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a  w->iTab = iTab;.
297c0 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65      pNew->maskSe
297d0 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
297e0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
297f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
29800 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
29810 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72  ->jointype|prior
29820 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f  JoinType) & (JT_
29830 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
29840 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74  =0 ){.      mExt
29850 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20  ra = mPrior;.   
29860 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e   }.    priorJoin
29870 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f  Type = pItem->jo
29880 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20  intype;.    if( 
29890 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
298a0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
298b0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
298c0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
298d0 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
298e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
298f0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
29900 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ree(pBuilder, mE
29910 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
29920 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
29940 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
29950 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
29960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72  );.    }.    mPr
29970 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73  ior |= pNew->mas
29980 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72  kSelf;.    if( r
29990 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  c || db->mallocF
299a0 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
299b0 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c   }.  whereLoopCl
299c0 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ear(db, pNew);. 
299d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
299e0 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57  *.** Examine a W
299f0 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74  herePath (with t
29a00 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74  he addition of t
29a10 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f  he extra WhereLo
29a20 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a  op of the 5th.**
29a30 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20   parameters) to 
29a40 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74  see if it output
29a50 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  s rows in the re
29a60 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59  quested ORDER BY
29a70 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59  .** (or GROUP BY
29a80 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72  ) without requir
29a90 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73  ing a separate s
29aa0 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ort operation.  
29ab0 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20  Return:.** .**  
29ac0 20 20 30 3a 20 20 4f 52 44 45 52 20 42 59 20 69    0:  ORDER BY i
29ad0 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2e  s not satisfied.
29ae0 20 20 53 6f 72 74 69 6e 67 20 72 65 71 75 69 72    Sorting requir
29af0 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44  ed.**    1:  ORD
29b00 45 52 20 42 59 20 69 73 20 73 61 74 69 73 66 69  ER BY is satisfi
29b10 65 64 2e 20 20 20 20 20 20 4f 6d 69 74 20 73 6f  ed.      Omit so
29b20 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20  rting.**   -1:  
29b30 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73 20  Unknown at this 
29b40 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  time.**.** Note 
29b50 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20  that processing 
29b60 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42  for WHERE_GROUPB
29b70 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54  Y and WHERE_DIST
29b80 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73  INCTBY is not as
29b90 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74  .** strict.  Wit
29ba0 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  h GROUP BY and D
29bb0 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79  ISTINCT the only
29bc0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20   requirement is 
29bd0 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65  that.** equivale
29be0 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69  nt rows appear i
29bf0 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63  mmediately adjac
29c00 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68  ent to one anoth
29c10 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a  er.  GROUP BY.**
29c20 20 61 6e 64 20 44 49 53 54 49 4e 54 20 64 6f 20   and DISTINT do 
29c30 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
29c40 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
29c50 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
29c60 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
29c70 20 65 71 75 69 76 65 6c 65 6e 74 20 72 6f 77 73   equivelent rows
29c80 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
29c90 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
29ca0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
29cb0 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
29cc0 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
29cd0 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
29ce0 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
29cf0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
29d00 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
29d10 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
29d20 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
29d30 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
29d40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
29d50 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
29d60 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
29d70 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
29d80 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
29d90 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
29da0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
29db0 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  /* ORDER BY or G
29dc0 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49  ROUP BY or DISTI
29dd0 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68  NCT clause to ch
29de0 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  eck */.  WherePa
29df0 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f  th *pPath,     /
29e00 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20  * The WherePath 
29e10 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31  to check */.  u1
29e20 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
29e30 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e      /* Might con
29e40 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50  tain WHERE_GROUP
29e50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54  BY or WHERE_DIST
29e60 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20  INCTBY */.  u16 
29e70 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nLoop,          
29e80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
29e90 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d  ntries in pPath-
29ea0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68  >aLoop[] */.  Wh
29eb0 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20  ereLoop *pLast, 
29ec0 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
29ed0 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65  WhereLoop to the
29ee0 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61   end of pPath->a
29ef0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d  Loop[] */.  Bitm
29f00 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20  ask *pRevMask   
29f10 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f    /* OUT: Mask o
29f20 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20  f WhereLoops to 
29f30 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  run in reverse o
29f40 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  rder */.){.  u8 
29f50 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20  revSet;         
29f60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
29f70 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  v is known */.  
29f80 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  u8 rev;         
29f90 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69        /* Composi
29fa0 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  te sort order */
29fb0 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20  .  u8 revIdx;   
29fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
29fd0 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  x sort order */.
29fe0 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74    u8 isOrderDist
29ff0 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70  inct;   /* All p
2a000 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  rior WhereLoops 
2a010 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  are order-distin
2a020 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69  ct */.  u8 disti
2a030 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a  nctColumns;   /*
2a040 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f   True if the loo
2a050 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54  p has UNIQUE NOT
2a060 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
2a070 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20  .  u8 isMatch;  
2a080 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c           /* iCol
2a090 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65  umn matches a te
2a0a0 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
2a0b0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
2a0c0 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  16 nKeyCol;     
2a0d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a0e0 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e  f key columns in
2a0f0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36   pIndex */.  u16
2a100 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
2a110 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2a120 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f  er of ordered co
2a130 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
2a140 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64  ex */.  u16 nOrd
2a150 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
2a160 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e   Number terms in
2a170 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2a180 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2a190 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2a1a0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72  /* Index of Wher
2a1b0 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62  eLoop in pPath b
2a1c0 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a  eing processed *
2a1d0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2a1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2a1f0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2a200 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
2a210 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2a220 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65  number for curre
2a230 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  nt WhereLoop */.
2a240 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
2a250 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
2a260 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
2a270 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a  n table iCur */.
2a280 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
2a290 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65  op = 0; /* Curre
2a2a0 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69  nt WhereLoop bei
2a2b0 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f  ng processed. */
2a2c0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2a2d0 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69  erm;     /* A si
2a2e0 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
2a2f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2a300 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72  .  Expr *pOBExpr
2a310 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ;        /* An e
2a320 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
2a330 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2a340 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  se */.  CollSeq 
2a350 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  *pColl;       /*
2a360 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f   COLLATE functio
2a370 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20  n from an ORDER 
2a380 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  BY clause term *
2a390 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
2a3a0 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x;        /* The
2a3b0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
2a3c0 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a  d with pLoop */.
2a3d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2a3e0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2a3f0 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
2a400 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2a410 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d   Bitmask obSat =
2a420 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f   0;    /* Mask o
2a430 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
2a440 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61   satisfied so fa
2a450 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  r */.  Bitmask o
2a460 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20  bDone;       /* 
2a470 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45  Mask of all ORDE
2a480 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
2a490 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73  Bitmask orderDis
2a4a0 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d  tinctMask;  /* M
2a4b0 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d  ask of all well-
2a4c0 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f  ordered loops */
2a4d0 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79  .  Bitmask ready
2a4e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2a4f0 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20  * Mask of inner 
2a500 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  loops */..  /*. 
2a510 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
2a520 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65  hereLoop is "one
2a530 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65  -row" if it gene
2a540 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68  rates no more th
2a550 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20  an one.  ** row 
2a560 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68  of output.  A Wh
2a570 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72  ereLoop is one-r
2a580 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ow if all of the
2a590 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
2a5a0 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41  rue:.  **  (a) A
2a5b0 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
2a5c0 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52   match with WHER
2a5d0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a  E_COLUMN_EQ..  *
2a5e0 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78  *  (b) The index
2a5f0 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20   is unique.  ** 
2a600 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  Any WhereLoop wi
2a610 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55  th an WHERE_COLU
2a620 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  MN_EQ constraint
2a630 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73   on the rowid is
2a640 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45   one-row..  ** E
2a650 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
2a660 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65  reLoop will have
2a670 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
2a680 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46  W bit set in wsF
2a690 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lags..  **.  ** 
2a6a0 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
2a6b0 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64  Loop is "order-d
2a6c0 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20  istinct" if the 
2a6d0 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  set of columns f
2a6e0 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68  rom.  ** that Wh
2a6f0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65  ereLoop that are
2a700 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2a710 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66   clause are diff
2a720 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a  erent for every.
2a730 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
2a740 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72  WhereLoop.  Ever
2a750 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
2a760 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63  oop is automatic
2a770 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d  ally.  ** order-
2a780 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68  distinct.   A Wh
2a790 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73  ereLoop that has
2a7a0 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   no columns in t
2a7b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2a7c0 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f  se.  ** is not o
2a7d0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54  rder-distinct. T
2a7e0 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
2a7f0 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65  nct is not quite
2a800 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69   the same as bei
2a810 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73  ng.  ** UNIQUE s
2a820 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f  ince a UNIQUE co
2a830 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61  lumn or index ca
2a840 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
2a850 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20  rows that .  ** 
2a860 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c  are NULL and NUL
2a870 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75  L values are equ
2a880 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20  ivalent for the 
2a890 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72  purpose of order
2a8a0 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20  -distinct..  ** 
2a8b0 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
2a8c0 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e  inct, the column
2a8d0 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45  s must be UNIQUE
2a8e0 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20   and NOT NULL.. 
2a8f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77   **.  ** The row
2a900 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69  id for a table i
2a910 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20  s always UNIQUE 
2a920 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20  and NOT NULL so 
2a930 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a  whenever the.  *
2a940 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20  * rowid appears 
2a950 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2a960 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72  clause, the corr
2a970 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c  esponding WhereL
2a980 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f  oop is.  ** auto
2a990 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d  matically order-
2a9a0 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a  distinct..  */..
2a9b0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
2a9c0 42 79 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  By!=0 );..  /* S
2a9d0 6f 72 74 61 62 69 6c 69 74 79 20 6f 66 20 76 69  ortability of vi
2a9e0 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 73 20  rtual tables is 
2a9f0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
2aa00 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
2aa10 68 6f 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  hod.  ** of the 
2aa20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 74  virtual table it
2aa30 73 65 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c  self */.  if( pL
2aa40 61 73 74 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ast->wsFlags & W
2aa50 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2aa60 45 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  E ){.    testcas
2aa70 65 28 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f  e( nLoop>0 );  /
2aa80 2a 20 54 72 75 65 20 77 68 65 6e 20 6f 75 74 65  * True when oute
2aa90 72 20 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d  r loops are one-
2aaa0 72 6f 77 20 61 6e 64 20 6d 61 74 63 68 20 0a 20  row and match . 
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aac0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f           ** no O
2aad0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
2aae0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 61 73  .    return pLas
2aaf0 74 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  t->u.vtab.isOrde
2ab00 72 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  red;.  }.  if( n
2ab10 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  Loop && Optimiza
2ab20 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
2ab30 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
2ab40 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  dxJoin) ) return
2ab50 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20   0;..  nOrderBy 
2ab60 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
2ab70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
2ab80 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29  OrderBy==BMS-1 )
2ab90 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
2aba0 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20  >BMS-1 ) return 
2abb0 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70  0;  /* Cannot op
2abc0 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61  timize overly la
2abd0 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f  rge ORDER BYs */
2abe0 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  .  isOrderDistin
2abf0 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65  ct = 1;.  obDone
2ac00 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65   = MASKBIT(nOrde
2ac10 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44  rBy)-1;.  orderD
2ac20 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b  istinctMask = 0;
2ac30 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20  .  ready = 0;.  
2ac40 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
2ac50 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
2ac60 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
2ac70 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
2ac80 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
2ac90 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
2aca0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
2acb0 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  lf;.    pLoop = 
2acc0 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50  iLoop<nLoop ? pP
2acd0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  ath->aLoop[iLoop
2ace0 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61  ] : pLast;.    a
2acf0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
2ad00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2ad10 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
2ad20 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57  );.    iCur = pW
2ad30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2ad40 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
2ad50 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
2ad60 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
2ad70 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
2ad80 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
2ad90 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
2ada0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2adb0 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
2adc0 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
2add0 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
2ade0 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
2adf0 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
2ae00 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
2ae10 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
2ae20 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
2ae30 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
2ae40 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2ae50 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
2ae60 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2ae70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ae80 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
2ae90 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2aea0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
2aeb0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2aec0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2aed0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2aee0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2aef0 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2af00 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2af10 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
2af20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  = findTerm(&pWIn
2af30 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
2af40 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
2af50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af60 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
2af70 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c  WO_EQ|WO_ISNULL,
2af80 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2af90 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
2afa0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
2afb0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
2afc0 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42  WO_EQ)!=0 && pOB
2afd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
2afe0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2aff0 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b  t char *z1, *z2;
2b000 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2b010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2b020 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2b030 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2b040 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2b050 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2b060 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2b070 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
2b080 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  1 = pColl->zName
2b090 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
2b0a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2b0b0 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
2b0c0 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
2b0d0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2b0e0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2b0f0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2b100 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f          z2 = pCo
2b110 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2b120 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2b130 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30  rICmp(z1, z2)!=0
2b140 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b150 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
2b160 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
2b170 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
2b180 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2b190 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
2b1a0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2b1b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2b1c0 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
2b1d0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
2b1e0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
2b1f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
2b200 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
2b210 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
2b220 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
2b230 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
2b240 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
2b250 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2b260 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2b270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2b280 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
2b290 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
2b2a0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
2b2b0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
2b2c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
2b2d0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
2b2e0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
2b2f0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
2b300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b310 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2b320 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31  [nColumn-1]==(-1
2b330 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  ) || !HasRowid(p
2b340 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b  Index->pTable));
2b350 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2b360 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65  Distinct = pInde
2b370 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
2b380 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  one;.      }..  
2b390 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2b3a0 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
2b3b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2b3c0 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
2b3d0 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
2b3e0 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
2b3f0 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
2b400 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
2b410 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
2b420 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
2b430 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
2b440 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2b450 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
2b460 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
2b470 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
2b480 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
2b490 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
2b4a0 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
2b4b0 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
2b4c0 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
2b4d0 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
2b4e0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
2b4f0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
2b500 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30  u.btree.nSkip==0
2b510 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
2b520 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
2b530 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
2b540 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
2b550 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  LL))!=0.        
2b560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b570 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
2b580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2b590 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2b5a0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
2b5b0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2b5c0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2b5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b5e0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2b5f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2b600 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
2b610 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
2b620 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
2b630 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
2b640 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
2b650 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
2b660 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
2b670 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
2b680 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
2b690 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
2b6a0 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
2b6b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
2b6c0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
2b6d0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
2b6e0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
2b6f0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
2b700 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2b710 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
2b720 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
2b730 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b740 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2b750 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2b760 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2b770 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
2b780 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
2b790 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
2b7a0 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
2b7b0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
2b7c0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
2b7d0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20   well-ordered.  
2b7e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2b7f0 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2b800 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
2b810 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
2b820 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
2b830 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2b840 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
2b850 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2b860 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
2b870 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2b880 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2b890 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2b8a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2b8b0 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
2b8c0 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
2b8d0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2b8e0 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
2b8f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2b900 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61  index and and ma
2b910 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
2b920 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
2b930 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
2b940 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
2b950 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
2b960 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
2b970 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
2b980 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2b990 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2b9a0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2b9b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2b9c0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2b9d0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2b9e0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2b9f0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2ba00 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2ba10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ba20 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
2ba30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
2ba40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ba50 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
2ba60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
2ba70 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
2ba80 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
2ba90 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
2baa0 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
2bab0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2bac0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2bad0 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
2bae0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2baf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2bb00 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2bb10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2bb20 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
2bb30 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
2bb40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2bb50 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
2bb60 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2bb70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2bb80 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
2bb90 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
2bba0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2bbb0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
2bbc0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2bbd0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2bbe0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2bbf0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2bc00 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
2bc10 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
2bc20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bc40 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
2bc50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2bc60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bc70 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
2bc80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2bc90 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2bca0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bcb0 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
2bcc0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
2bcd0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2bce0 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
2bcf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
2bd00 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2bd10 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i);.          if
2bd20 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2bd30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2bd40 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
2bd50 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
2bd60 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
2bd70 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
2bd80 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
2bd90 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
2bda0 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
2bdb0 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
2bdc0 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
2bdd0 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
2bde0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53          if( revS
2bdf0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
2be00 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
2be10 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
2be20 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2be30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2be40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2be60 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
2be70 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2be80 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
2be90 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
2bea0 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
2beb0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
2bec0 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74            revSet
2bed0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2bee0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2bef0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2bf00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
2bf10 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
2bf20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
2bf30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
2bf40 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2bf50 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2bf60 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
2bf70 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2bf80 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
2bf90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bfa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2bfb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
2bfc0 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
2bfd0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2bfe0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
2bff0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
2c000 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2c010 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2c020 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2c030 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2c040 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2c050 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
2c060 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
2c070 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2c080 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
2c090 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
2c0a0 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
2c0b0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2c0c0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
2c0d0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2c0e0 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2c0f0 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
2c100 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
2c110 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
2c120 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69  pr *p;.        i
2c130 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2c140 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2c150 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
2c160 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2c170 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2c180 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
2c190 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2c1a0 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74  t, p)&~orderDist
2c1b0 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
2c1c0 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2c1d0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2c1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c1f0 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e  .    }.  } /* En
2c200 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  d the loop over 
2c210 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  all WhereLoops f
2c220 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64  rom outer-most d
2c230 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73  own to inner-mos
2c240 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74  t */.  if( obSat
2c250 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
2c260 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  n 1;.  if( !isOr
2c270 64 65 72 44 69 73 74 69 6e 63 74 20 29 20 72 65  derDistinct ) re
2c280 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
2c290 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57   -1;.}..#ifdef W
2c2a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2c2b0 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69  D./* For debuggi
2c2c0 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a  ng use only: */.
2c2d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2c2e0 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65  r *wherePathName
2c2f0 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74  (WherePath *pPat
2c300 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68  h, int nLoop, Wh
2c310 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b  ereLoop *pLast){
2c320 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
2c330 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20  Name[65];.  int 
2c340 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
2c350 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61  nLoop; i++){ zNa
2c360 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61  me[i] = pPath->a
2c370 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a  Loop[i]->cId; }.
2c380 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e    if( pLast ) zN
2c390 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74  ame[i++] = pLast
2c3a0 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69  ->cId;.  zName[i
2c3b0 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
2c3c0 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
2c3d0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
2c3e0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
2c3f0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
2c400 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
2c410 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
2c420 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
2c430 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2c440 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
2c450 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
2c460 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
2c470 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
2c480 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
2c490 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
2c4a0 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
2c4b0 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
2c4c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
2c4d0 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
2c4e0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
2c4f0 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
2c500 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
2c510 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
2c520 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
2c530 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
2c540 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
2c550 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
2c560 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
2c570 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
2c580 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
2c590 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
2c5a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
2c5b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2c5c0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
2c5d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
2c5e0 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b  LogEst nRowEst){
2c5f0 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b  .  int mxChoice;
2c600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c610 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2c620 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
2c630 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
2c640 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
2c650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c660 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
2c670 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
2c680 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2c690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2c6a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2c6b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c6d0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
2c6e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
2c6f0 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
2c700 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2c710 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74  unter over the t
2c720 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  erms of the join
2c730 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a   */.  int ii, jj
2c740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c750 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2c760 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20   */.  int mxI = 
2c770 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c780 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
2c790 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63   entry to replac
2c7a0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43  e */.  LogEst rC
2c7b0 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
2c7c0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61   /* Cost of a pa
2c7d0 74 68 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  th */.  LogEst n
2c7e0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
2c7f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
2c800 75 74 70 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45  utputs */.  LogE
2c810 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
2c820 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2c830 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
2c840 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
2c850 45 73 74 20 6d 78 4f 75 74 20 3d 20 30 3b 20 20  Est mxOut = 0;  
2c860 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
2c870 6d 20 6e 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20  m nOut value on 
2c880 74 68 65 20 73 65 74 20 6f 66 20 70 61 74 68 73  the set of paths
2c890 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 6f   */.  LogEst rSo
2c8a0 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  rtCost;         
2c8b0 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20  /* Cost to do a 
2c8c0 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  sort */.  int nT
2c8d0 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
2c8e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c8f0 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
2c900 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
2c910 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
2c920 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
2c930 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
2c940 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
2c950 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
2c960 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
2c970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c980 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
2c990 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
2c9a0 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
2c9b0 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
2c9c0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
2c9d0 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
2c9e0 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2c9f0 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
2ca00 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
2ca10 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
2ca20 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
2ca30 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
2ca40 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
2ca50 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
2ca60 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
2ca70 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2ca80 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2ca90 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
2caa0 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
2cab0 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
2cac0 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mory */.  char *
2cad0 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
2cae0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
2caf0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2cb00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
2cb10 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
2cb20 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
2cb30 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2cb40 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
2cb50 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55  >nLevel;.  /* TU
2cb60 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65  NING: For simple
2cb70 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74   queries, only t
2cb80 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20  he best path is 
2cb90 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f  tracked..  ** Fo
2cba0 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74  r 2-way joins, t
2cbb0 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20  he 5 best paths 
2cbc0 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20  are followed..  
2cbd0 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20  ** For joins of 
2cbe0 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73  3 or more tables
2cbf0 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62  , track the 10 b
2cc00 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d  est paths */.  m
2cc10 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70  xChoice = (nLoop
2cc20 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f  ==1) ? 1 : (nLoo
2cc30 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a  p==2 ? 5 : 10);.
2cc40 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c    assert( nLoop<
2cc50 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
2cc60 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45  t->nSrc );.  WHE
2cc70 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28  RETRACE(0x002, (
2cc80 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76  "---- begin solv
2cc90 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41  er\n"));..  /* A
2cca0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2ccb0 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
2ccc0 20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a   aTo and aFrom *
2ccd0 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66  /.  ii = (sizeof
2cce0 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
2ccf0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
2cd00 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
2cd10 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
2cd20 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2cd30 64 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70  db, ii);.  if( p
2cd40 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
2cd50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2cd60 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
2cd70 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
2cd80 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
2cd90 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
2cda0 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
2cdb0 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
2cdc0 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
2cdd0 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
2cde0 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
2cdf0 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
2ce00 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
2ce10 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
2ce20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
2ce30 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20  oop = pX;.  }.. 
2ce40 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
2ce50 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
2ce60 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
2ce70 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
2ce80 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
2ce90 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
2cea0 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
2ceb0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
2cec0 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74   above 25.  If t
2ced0 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
2cee0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
2cef0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
2cf00 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
2cf10 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
2cf20 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  5.  ** rows, the
2cf30 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
2cf40 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
2cf50 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
2cf60 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
2cf70 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
2cf80 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  6);  assert( 46=
2cf90 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
2cfa0 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  5) );.  nFrom = 
2cfb0 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70  1;..  /* Precomp
2cfc0 75 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ute the cost of 
2cfd0 73 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61  sorting the fina
2cfe0 6c 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66  l result set, if
2cff0 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
2d000 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
2d010 42 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63  Begin() was conc
2d020 65 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74  erned about sort
2d030 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f  ing */.  rSortCo
2d040 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  st = 0;.  if( pW
2d050 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
2d060 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
2d070 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e  ){.    aFrom[0].
2d080 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2d090 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
2d0a0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
2d0b0 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f  mated cost of so
2d0c0 72 74 69 6e 67 20 69 73 20 34 38 2a 4e 2a 6c 6f  rting is 48*N*lo
2d0d0 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
2d0e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
2d0f0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
2d100 73 2e 20 54 68 65 20 34 38 20 69 73 20 74 68 65  s. The 48 is the
2d110 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f   expected size o
2d120 66 20 61 20 72 6f 77 20 74 6f 20 73 6f 72 74 2e  f a row to sort.
2d130 20 0a 20 20 20 20 2a 2a 20 46 49 58 4d 45 3a 20   .    ** FIXME: 
2d140 20 63 6f 6d 70 75 74 65 20 61 20 62 65 74 74 65   compute a bette
2d150 72 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  r estimate of th
2d160 65 20 34 38 20 6d 75 6c 74 69 70 6c 69 65 72 20  e 48 multiplier 
2d170 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 20  based on the.   
2d180 20 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 65   ** result set e
2d190 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
2d1a0 20 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e     rSortCost = n
2d1b0 52 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28  RowEst + estLog(
2d1c0 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48  nRowEst);.    WH
2d1d0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 28  ERETRACE(0x002,(
2d1e0 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
2d1f0 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f  %-3d\n", rSortCo
2d200 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
2d210 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
2d220 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
2d230 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
2d240 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
2d250 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
2d260 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
2d270 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
2d280 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
2d290 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
2d2a0 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
2d2b0 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
2d2c0 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
2d2d0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
2d2e0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
2d2f0 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
2d300 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
2d310 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
2d320 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2d330 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
2d340 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
2d350 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
2d360 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
2d370 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2d380 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20   maskNew;.      
2d390 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
2d3a0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  k = 0;.        u
2d3b0 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  8 isOrderedValid
2d3c0 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
2d3d0 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
2d3e0 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d    u8 isOrdered =
2d3f0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
2d400 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  d;.        if( (
2d410 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
2d420 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
2d430 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
2d440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
2d450 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
2d460 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
2d470 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
2d480 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  ;.        /* At 
2d490 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f  this point, pWLo
2d4a0 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  op is a candidat
2d4b0 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74  e to be the next
2d4c0 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20   loop. .        
2d4d0 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  ** Compute its c
2d4e0 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ost */.        r
2d4f0 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Cost = sqlite3Lo
2d500 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
2d510 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
2d520 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
2d530 77 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73  w);.        rCos
2d540 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2d550 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f  tAdd(rCost, pFro
2d560 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20  m->rCost);.     
2d570 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d     nOut = pFrom-
2d580 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
2d590 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  nOut;.        ma
2d5a0 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
2d5b0 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
2d5c0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2d5d0 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
2d5e0 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
2d5f0 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
2d600 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2d610 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d630 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
2d640 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
2d650 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2d660 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2d670 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
2d680 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
2d690 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
2d6a0 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65    case 1:  /* Ye
2d6b0 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  s.  pFrom+pWLoop
2d6c0 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68   does satisfy th
2d6d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d6e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2d6f0 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31     isOrdered = 1
2d700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d710 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2d720 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2d730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2d740 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a       case 0:  /*
2d750 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f   No.  pFrom+pWLo
2d760 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  op will require 
2d770 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
2d780 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2d790 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a   isOrdered = 0;.
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2d7b0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
2d7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d7d0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
2d7e0 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20  ogEstAdd(rCost, 
2d7f0 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20  rSortCost);.    
2d800 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2d810 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
2d820 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20  ault: /* Cannot 
2d830 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61  tell yet.  Try a
2d840 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74  gain on the next
2d850 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
2d860 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d870 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2d880 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d890 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20          revMask 
2d8a0 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
2d8b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d8c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2d8d0 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
2d8e0 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
2d8f0 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65   the mxChoice be
2d900 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
2d910 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
2d920 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
2d930 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
2d940 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2d950 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
2d960 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ew.           &&
2d970 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
2d980 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64 56  alid==isOrderedV
2d990 61 6c 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  alid.           
2d9a0 26 26 20 28 28 70 54 6f 2d 3e 72 43 6f 73 74 3c  && ((pTo->rCost<
2d9b0 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
2d9c0 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20  Row<=nOut) ||.  
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
2d9e0 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f 73 74  To->rCost>=rCost
2d9f0 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e   && pTo->nRow>=n
2da00 4f 75 74 29 29 0a 20 20 20 20 20 20 20 20 20 20  Out)).          
2da10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2da20 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
2da30 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
2da40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2da50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2da60 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
2da70 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
2da80 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
2da90 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f  e && rCost>=mxCo
2daa0 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
2dab0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2dac0 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2dad0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2dae0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2daf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2db00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2db10 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
2db20 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
2db30 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2db40 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2db50 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2db60 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2db70 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db90 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
2dba0 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
2dbb0 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
2dbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
2dbd0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
2dbe0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2dbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dc00 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50    /* Add a new P
2dc10 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d  ath to the aTo[]
2dc20 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20   set */.        
2dc30 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69    if( nTo<mxChoi
2dc40 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
2dc50 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
2dc60 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54  e size of the aT
2dc70 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a  o set by one */.
2dc80 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
2dc90 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20   nTo++;.        
2dca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dcb0 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68       /* New path
2dcc0 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72   replaces the pr
2dcd0 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65  ior worst to kee
2dce0 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78  p count below mx
2dcf0 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20  Choice */.      
2dd00 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a        jj = mxI;.
2dd10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dd20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f        pTo = &aTo
2dd30 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45  [jj];.#ifdef WHE
2dd40 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2dd50 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2dd60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2dd70 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
2dd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2dd90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2dda0 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d  "New    %s cost=
2ddb0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
2ddc0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
2ddd0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
2dde0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
2ddf0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
2de00 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
2de10 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2de20 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
2de30 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2de40 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2de50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2de60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2de70 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
2de80 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54  ost<=rCost && pT
2de90 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b  o->nRow<=nOut ){
2dea0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2deb0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
2dec0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
2ded0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2dee0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
2def0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2df00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
2df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
2df30 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
2df40 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
2df50 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
2df60 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
2df70 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
2df80 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
2df90 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2dfa0 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
2dfb0 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2dfc0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2dfd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2dfe0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2dff0 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
2e000 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  d,%d order=%c\n"
2e010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e020 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2e030 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
2e040 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
2e050 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
2e070 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2e080 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
2e090 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
2e0a0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2e0b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2e0c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2e0d0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
2e0e0 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
2e0f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2e100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2e120 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
2e130 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
2e140 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
2e150 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
2e160 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
2e170 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
2e180 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
2e190 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
2e1a0 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
2e1b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2e1c0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e1e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e200 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
2e210 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
2e220 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
2e230 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2e240 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2e250 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
2e260 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
2e270 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2e280 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
2e290 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2e2a0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
2e2b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2e2c0 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
2e2d0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
2e2e0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2e2f0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2e300 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
2e310 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
2e320 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
2e330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e340 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
2e350 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
2e360 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2e370 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2e380 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2e390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e3a0 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
2e3b0 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
2e3c0 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
2e3d0 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
2e3e0 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
2e3f0 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
2e400 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
2e410 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2e420 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
2e430 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
2e440 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f    pTo->nRow = nO
2e450 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ut;.        pTo-
2e460 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
2e470 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
2e480 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 69 73  rderedValid = is
2e490 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20  OrderedValid;.  
2e4a0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2e4b0 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
2e4c0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2e4d0 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
2e4e0 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
2e4f0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
2e500 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
2e510 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
2e520 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
2e530 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
2e540 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
2e550 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20   mxI = 0;.      
2e560 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
2e570 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
2e580 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 61 54 6f       mxOut = aTo
2e590 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
2e5a0 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
2e5b0 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
2e5c0 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
2e5d0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
2e5e0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
2e5f0 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d  >mxCost || (pTo-
2e600 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  >rCost==mxCost &
2e610 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75  & pTo->nRow>mxOu
2e620 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
2e630 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f      mxCost = pTo
2e640 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
2e650 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 70         mxOut = p
2e660 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  To->nRow;.      
2e670 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
2e680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2e690 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e6a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e6b0 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
2e6c0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
2e6d0 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
2e6e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2e6f0 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ace>=2 ){.      
2e700 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2e710 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72  tf("---- after r
2e720 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c  ound %d ----\n",
2e730 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66   iLoop);.      f
2e740 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(ii=0, pTo=aTo
2e750 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20  ; ii<nTo; ii++, 
2e760 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2e770 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2e780 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33  tf(" %s cost=%-3
2e790 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65  d nrow=%-3d orde
2e7a0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
2e7b0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2e7c0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
2e7d0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
2e7e0 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
2e7f0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
2e800 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
2e810 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
2e820 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
2e830 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
2e840 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 26  isOrderedValid &
2e850 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
2e860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e870 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2e880 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
2e890 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
2e8a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e8b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e8c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
2e8d0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
2e8e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2e8f0 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
2e900 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
2e910 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
2e920 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
2e930 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
2e940 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
2e950 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
2e960 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
2e970 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
2e980 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
2e990 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2e9a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2e9b0 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
2e9c0 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
2e9d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
2e9e0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2e9f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2ea00 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
2ea10 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
2ea20 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
2ea30 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
2ea40 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
2ea50 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
2ea60 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
2ea70 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
2ea80 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
2ea90 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
2eaa0 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
2eab0 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
2eac0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2ead0 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
2eae0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
2eaf0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
2eb00 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
2eb10 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
2eb20 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
2eb30 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
2eb40 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
2eb50 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
2eb60 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
2eb70 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
2eb80 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
2eb90 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
2eba0 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
2ebb0 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
2ebc0 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
2ebd0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2ebe0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
2ebf0 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
2ec00 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2ec10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2ec20 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
2ec30 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2ec40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ec50 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
2ec60 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
2ec70 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
2ec80 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
2ec90 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
2eca0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
2ecb0 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
2ecc0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
2ecd0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
2ece0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65  nfo, pWInfo->pRe
2ecf0 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a  sultSet, pFrom,.
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed10 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2ed20 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  Y, nLoop-1, pFro
2ed30 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
2ed40 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ], &notUsed);.  
2ed50 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70 57    if( rc==1 ) pW
2ed60 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
2ed70 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2ed80 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20  _ORDERED;.  }.  
2ed90 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
2eda0 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20  ered ){.    if( 
2edb0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2edc0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
2edd0 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 70  NCTBY ){.      p
2ede0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2edf0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2ee00 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
2ee10 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
2ee20 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a  fo->bOBSat = 1;.
2ee30 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
2ee40 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
2ee50 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  evLoop;.    }.  
2ee60 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  }.  pWInfo->nRow
2ee70 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
2ee80 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
2ee90 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
2eea0 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
2eeb0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
2eec0 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
2eed0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2eee0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
2eef0 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
2ef00 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
2ef10 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
2ef20 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
2ef30 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
2ef40 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
2ef50 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
2ef60 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2ef70 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
2ef80 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
2ef90 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
2efa0 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
2efb0 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
2efc0 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
2efd0 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
2efe0 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
2eff0 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
2f000 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
2f010 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2f020 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
2f030 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
2f040 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
2f050 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
2f060 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
2f070 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
2f080 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
2f090 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
2f0a0 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
2f0b0 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
2f0c0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
2f0d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2f0e0 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
2f0f0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2f100 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
2f110 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
2f120 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2f130 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
2f140 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
2f150 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2f160 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
2f170 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
2f180 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
2f190 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
2f1a0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20  dex *pIdx;.  .  
2f1b0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
2f1c0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
2f1d0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2f1e0 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
2f1f0 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e  E_TABLE ) return
2f200 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
2f210 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2f220 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
2f230 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
2f240 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
2f250 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2f260 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2f270 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
2f280 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
2f290 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20 30  Index ) return 0
2f2a0 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
2f2b0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43  ->iCursor;.  pWC
2f2c0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
2f2d0 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c  .  pLoop = pBuil
2f2e0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f  der->pNew;.  pLo
2f2f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  op->wsFlags = 0;
2f300 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
2f310 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  e.nSkip = 0;.  p
2f320 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
2f330 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
2f340 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69  , WO_EQ, 0);.  i
2f350 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
2f360 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
2f370 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2f380 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
2f390 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
2f3a0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
2f3b0 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
2f3c0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2f3d0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
2f3e0 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
2f3f0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
2f400 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
2f410 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
2f420 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
2f430 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
2f440 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
2f450 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
2f460 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
2f470 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
2f480 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
2f490 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
2f4a0 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
2f4b0 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
2f4c0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
2f4d0 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
2f4e0 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20  mSpace)==4 );.  
2f4f0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
2f500 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a  Error==OE_None .
2f510 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
2f520 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
2f530 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
2f540 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53  ->nKeyCol>ArrayS
2f550 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
2f560 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29  mSpace) .      )
2f570 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2f580 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
2f590 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
2f5a0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
2f5b0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
2f5c0 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  Cur, pIdx->aiCol
2f5d0 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51  umn[j], 0, WO_EQ
2f5e0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
2f5f0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
2f600 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70  break;.        p
2f610 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
2f620 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
2f630 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
2f640 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
2f650 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
2f660 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
2f670 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
2f680 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
2f690 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
2f6a0 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
2f6b0 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
2f6c0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
2f6d0 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
2f6e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2f6f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
2f700 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
2f710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f720 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
2f730 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
2f740 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
2f750 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
2f760 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
2f770 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
2f780 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
2f790 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
2f7a0 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
2f7b0 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
2f7c0 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
2f7d0 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
2f7e0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
2f7f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2f800 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
2f810 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
2f820 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
2f830 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
2f840 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
2f850 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
2f860 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
2f870 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
2f880 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66  iCur);.    pWInf
2f890 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
2f8a0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
2f8b0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
2f8c0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2f8d0 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
2f8e0 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b  fo->bOBSat =  1;
2f8f0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2f900 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2f910 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
2f920 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
2f930 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2f940 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2f950 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
2f960 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2f970 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
2f980 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
2f990 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2f9a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2f9b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
2f9c0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2f9d0 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
2f9e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
2f9f0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
2fa00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
2fa10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2fa20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
2fa30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
2fa40 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
2fa50 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
2fa60 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
2fa70 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
2fa80 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
2fa90 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
2faa0 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
2fab0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2fac0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2fad0 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
2fae0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
2faf0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
2fb00 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
2fb10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2fb20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2fb30 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
2fb40 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
2fb50 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
2fb60 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
2fb70 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
2fb80 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
2fb90 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
2fba0 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
2fbb0 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
2fbc0 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
2fbd0 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
2fbe0 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
2fbf0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
2fc00 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
2fc10 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
2fc20 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
2fc30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
2fc40 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
2fc50 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
2fc60 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
2fc70 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
2fc80 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
2fc90 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
2fca0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
2fcb0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
2fcc0 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
2fcd0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2fce0 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
2fcf0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
2fd00 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2fd10 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
2fd20 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
2fd30 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
2fd40 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
2fd50 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
2fd60 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2fd70 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
2fd80 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2fd90 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
2fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdb0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2fdc0 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
2fdd0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdf0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
2fe00 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
2fe10 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
2fe20 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
2fe30 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
2fe40 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
2fe50 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
2fe60 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
2fe70 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
2fe80 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
2fe90 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
2fea0 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
2feb0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
2fec0 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
2fed0 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
2fee0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2fef0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
2ff00 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
2ff10 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
2ff20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
2ff30 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2ff40 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
2ff50 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
2ff60 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
2ff70 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
2ff80 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
2ff90 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
2ffa0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
2ffb0 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
2ffc0 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
2ffd0 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
2ffe0 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
2fff0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
30000 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
30010 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
30020 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
30030 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
30040 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
30050 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
30060 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
30070 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
30080 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
30090 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
300a0 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
300b0 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
300c0 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
300d0 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
300e0 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
300f0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
30100 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
30110 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
30120 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
30130 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
30140 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
30150 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
30160 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
30170 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
30180 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
30190 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
301a0 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
301b0 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
301c0 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
301d0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
301e0 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
301f0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
30200 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
30210 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
30220 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
30230 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
30240 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
30250 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
30260 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
30270 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
30280 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
30290 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
302a0 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
302b0 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
302c0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
302d0 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
302e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
302f0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
30300 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
30310 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
30320 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
30330 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
30340 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
30350 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
30360 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
30370 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
30380 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
30390 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
303a0 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
303b0 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
303c0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
303d0 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
303e0 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
303f0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
30400 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
30410 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
30420 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
30430 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
30440 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
30450 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
30460 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
30470 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
30480 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
30490 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
304a0 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
304b0 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
304c0 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
304d0 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
304e0 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
304f0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
30500 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
30510 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
30520 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
30530 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
30540 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
30550 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
30560 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
30570 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
30580 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
30590 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
305a0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
305b0 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
305c0 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
305d0 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
305e0 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
305f0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
30600 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
30610 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
30620 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
30630 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
30640 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
30650 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
30660 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
30670 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
30680 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
30690 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
306a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
306b0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
306c0 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
306d0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
306e0 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
306f0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
30700 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
30710 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
30720 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
30730 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
30740 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
30750 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
30760 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
30770 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
30780 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  .** WHERE_ONETAB
30790 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
307a0 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63  iIdxCur is the c
307b0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
307c0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75  an index.** to u
307d0 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  se for OR clause
307e0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
307f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  e WHERE clause s
30800 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a  hould use this.*
30810 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f  * specific curso
30820 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45  r.  If WHERE_ONE
30830 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20  PASS_DESIRED is 
30840 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75  set, then iIdxCu
30850 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  r is.** the firs
30860 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61  t cursor in an a
30870 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20  rray of cursors 
30880 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  for all indices.
30890 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64    iIdxCur should
308a0 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
308b0 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f  ompute the appro
308c0 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65  priate cursor de
308d0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
308e0 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65   index is.** use
308f0 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
30900 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
30910 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
30920 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
30930 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
30940 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
30950 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
30960 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
30970 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
30980 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
30990 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
309a0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
309b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
309c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
309d0 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
309e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
309f0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
30a00 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
30a10 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
30a20 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
30a30 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
30a40 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
30a50 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
30a60 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
30a70 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
30a80 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
30a90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
30aa0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
30ab0 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
30ac0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
30ad0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
30ae0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
30af0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
30b00 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
30b10 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
30b20 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
30b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30b40 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
30b50 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
30b60 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
30b70 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
30b80 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
30b90 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
30ba0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
30bb0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
30bc0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
30bd0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
30be0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
30bf0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
30c00 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
30c10 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
30c20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
30c30 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
30c40 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
30c50 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
30c60 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
30c70 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
30c80 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
30c90 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
30ca0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
30cb0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
30cc0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
30cd0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
30ce0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
30cf0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
30d00 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
30d10 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
30d20 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
30d30 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
30d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d50 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30d60 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
30d70 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
30d80 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
30d90 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
30da0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
30db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30dc0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20  turn code */... 
30dd0 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
30de0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
30df0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
30e00 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
30e10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
30e20 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65  ));.  sWLB.pOrde
30e30 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
30e40 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
30e50 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
30e60 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
30e70 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
30e80 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
30e90 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
30ea0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
30eb0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
30ec0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
30ed0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
30ee0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
30ef0 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
30f00 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
30f10 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
30f20 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
30f30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
30f40 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
30f50 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
30f60 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
30f70 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
30f80 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
30f90 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
30fa0 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
30fb0 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
30fc0 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
30fd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
30fe0 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
30ff0 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
31000 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
31010 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
31020 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
31030 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
31040 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
31050 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
31060 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
31070 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
31080 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
31090 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
310a0 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
310b0 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
310c0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
310d0 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
310e0 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
310f0 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
31100 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
31110 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
31120 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
31130 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
31140 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
31150 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
31160 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
31170 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
31180 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
31190 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
311a0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
311b0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
311c0 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
311d0 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
311e0 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
311f0 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
31200 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
31210 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
31220 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
31230 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
31240 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
31250 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
31260 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
31270 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
31280 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
31290 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
312a0 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
312b0 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
312c0 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
312d0 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
312e0 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
312f0 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
31300 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
31310 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
31320 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
31330 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
31340 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
31350 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
31360 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
31370 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
31380 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
31390 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
313a0 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
313b0 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
313c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
313d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
313e0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
313f0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
31400 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
31410 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
31420 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
31430 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
31440 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
31450 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
31460 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
31470 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
31480 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
31490 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
314a0 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
314b0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
314c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
314d0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
314e0 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
314f0 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
31500 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
31510 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
31520 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
31530 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
31540 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
31550 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
31560 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
31570 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
31580 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
31590 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
315a0 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
315b0 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
315c0 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
315d0 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
315e0 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
315f0 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
31600 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
31610 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
31620 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
31630 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
31640 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
31650 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
31660 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
31670 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
31680 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
31690 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
316a0 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
316b0 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
316c0 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
316d0 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
316e0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
316f0 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
31700 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
31710 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
31720 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
31730 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72   pWInfo);.  wher
31740 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e  eSplit(&pWInfo->
31750 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  sWC, pWhere, TK_
31760 41 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  AND);.  sqlite3C
31770 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
31780 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20  pParse, -1); /* 
31790 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69  Insert the cooki
317a0 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20  e verifier Goto 
317b0 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  */.    .  /* Spe
317c0 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
317d0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
317e0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
317f0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
31800 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
31810 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
31820 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
31830 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
31840 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
31850 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
31860 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
31870 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
31880 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
31890 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
318a0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
318b0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
318c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
318d0 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
318e0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
318f0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
31920 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
31930 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
31940 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
31950 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
31960 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
31970 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
31980 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
31990 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
319a0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
319b0 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61   ) pWInfo->bOBSa
319c0 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 77  t = 1;.    if( w
319d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
319e0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
319f0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
31a00 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
31a10 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
31a20 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
31a30 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
31a40 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
31a50 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
31a60 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
31a70 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
31a80 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
31a90 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
31aa0 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
31ab0 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
31ac0 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
31ad0 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
31ae0 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
31af0 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
31b00 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
31b10 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
31b20 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
31b30 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
31b40 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
31b50 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
31b60 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
31b70 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
31b80 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
31b90 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
31ba0 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
31bb0 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
31bc0 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
31bd0 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
31be0 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
31bf0 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
31c00 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
31c10 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
31c20 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
31c30 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
31c40 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
31c50 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
31c60 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
31c70 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
31c80 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
31c90 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
31ca0 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
31cb0 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
31cc0 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  5..  **.  ** Not
31cd0 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
31ce0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
31cf0 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
31d00 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
31d10 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
31d20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
31d30 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
31d40 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
31d50 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
31d60 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
31d70 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
31d80 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
31d90 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
31da0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
31db0 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
31dc0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
31dd0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
31de0 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
31df0 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
31e00 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
31e10 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
31e20 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
31e30 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
31e40 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
31e50 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
31e60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
31e70 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
31e80 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
31e90 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
31ea0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
31eb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31ec0 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
31ed0 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
31ee0 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
31ef0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
31f00 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
31f10 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
31f20 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
31f30 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
31f40 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
31f50 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
31f60 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
31f70 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
31f80 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
31f90 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
31fa0 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
31fb0 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
31fc0 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
31fd0 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
31fe0 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
31ff0 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
32000 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
32010 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
32020 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  */.  exprAnalyze
32030 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70  All(pTabList, &p
32040 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
32050 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
32060 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
32070 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
32080 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
32090 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  e ORDER BY (or G
320a0 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20  ROUP BY) clause 
320b0 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
320c0 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20  ces to general. 
320d0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   ** expressions,
320e0 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74 20 62   then we won't b
320f0 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  e able to satisf
32100 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64 69 63  y it using indic
32110 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61  es, so.  ** go a
32120 68 65 61 64 20 61 6e 64 20 64 69 73 61 62 6c 65  head and disable
32130 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
32140 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
32150 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
32160 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
32170 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  T)!=0 ){.    for
32180 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72  (ii=0; ii<pOrder
32190 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
321a0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
321b0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
321c0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
321d0 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78  derBy->a[ii].pEx
321e0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
321f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
32200 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UMN ){.        p
32210 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
32220 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  = pOrderBy = 0;.
32230 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
32240 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
32250 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
32260 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
32270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32280 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
32290 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
322a0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
322b0 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
322c0 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
322d0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
322e0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
322f0 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
32300 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
32310 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
32320 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
32330 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
32340 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
32350 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
32360 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
32370 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
32380 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
32390 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
323a0 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
323b0 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
323c0 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
323d0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
323e0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
323f0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
32400 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
32410 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
32420 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
32430 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
32440 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
32450 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
32460 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
32470 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
32480 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20   ***\n"));.  /* 
32490 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
324a0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
324b0 6c 61 75 73 65 20 2a 2f 0a 23 69 66 20 64 65 66  lause */.#if def
324c0 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
324d0 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66 69  ENABLED) && defi
324e0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
324f0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
32500 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
32510 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
32520 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
32530 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
32540 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73  se->pVdbe;.    s
32550 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67  qlite3ExplainBeg
32560 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69  in(v);.    for(i
32570 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  =0; i<sWLB.pWC->
32580 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
32590 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
325a0 6e 50 72 69 6e 74 66 28 76 2c 20 22 23 25 2d 32  nPrintf(v, "#%-2
325b0 64 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  d ", i);.      s
325c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
325d0 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72  h(v);.      wher
325e0 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20  eExplainTerm(v, 
325f0 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29  &sWLB.pWC->a[i])
32600 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
32610 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20  xplainPop(v);.  
32620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
32630 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  inNL(v);.    }. 
32640 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
32650 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20  nFinish(v);.    
32660 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32670 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
32680 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28  VdbeExplanation(
32690 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  v));.  }.#endif.
326a0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
326b0 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
326c0 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
326d0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
326e0 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
326f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
32700 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
32710 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69  or;.  .    /* Di
32720 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65  splay all of the
32730 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
32740 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65  ts if wheretrace
32750 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23   is enabled */.#
32760 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
32770 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20  _ENABLED /* !=0 
32780 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
32790 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
327a0 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
327b0 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  *p;.      int i;
327c0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 68  .      static ch
327d0 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30  ar zLabel[] = "0
327e0 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67  123456789abcdefg
327f0 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
32800 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20  yxz".           
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32820 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43              "ABC
32830 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
32840 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20  TUVWYXZ";.      
32850 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  for(p=pWInfo->pL
32860 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d  oops, i=0; p; p=
32870 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b  p->pNextLoop, i+
32880 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63  +){.        p->c
32890 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69  Id = zLabel[i%si
328a0 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20  zeof(zLabel)];. 
328b0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
328c0 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57  Print(p, sWLB.pW
328d0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
328e0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20  }.#endif.  .    
328f0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
32900 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20  pWInfo, 0);.    
32910 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
32920 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
32930 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
32940 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
32950 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
32960 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
32970 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
32980 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20  nRowOut+1);.    
32990 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
329a0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
329b0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
329c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
329d0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
329e0 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  ==0 && (db->flag
329f0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
32a00 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20  seOrder)!=0 ){. 
32a10 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
32a20 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28  ask = (Bitmask)(
32a30 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  -1);.  }.  if( p
32a40 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e  Parse->nErr || N
32a50 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EVER(db->mallocF
32a60 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f  ailed) ){.    go
32a70 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
32a80 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57  or;.  }.#ifdef W
32a90 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32aa0 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66  D /* !=0 */.  if
32ab0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
32ac0 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ace ){.    int i
32ad0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  i;.    sqlite3De
32ae0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
32af0 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
32b00 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
32b10 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
32b20 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20  nfo->bOBSat ){. 
32b30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
32b40 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
32b50 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  Y=0x%llx", pWInf
32b60 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
32b70 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
32b80 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
32b90 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
32ba0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
32bb0 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
32bc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32bd0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
32be0 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
32bf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
32c00 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
32c10 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
32c20 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
32c30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32c40 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
32c50 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
32c60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32c70 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
32c80 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
32c90 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
32ca0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32cb0 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
32cc0 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
32cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
32ce0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
32cf0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
32d00 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
32d10 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
32d20 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
32d30 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
32d40 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
32d50 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29  WLoop, sWLB.pWC)
32d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
32d70 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
32d80 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
32d90 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
32da0 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
32db0 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
32dc0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
32dd0 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
32de0 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
32df0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
32e00 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
32e10 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
32e20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
32e30 62 55 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74  bUsed = exprList
32e40 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
32e50 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29  Set, pResultSet)
32e60 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70  ;.    if( sWLB.p
32e70 4f 72 64 65 72 42 79 20 29 20 74 61 62 55 73 65  OrderBy ) tabUse
32e80 64 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  d |= exprListTab
32e90 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
32ea0 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29  , sWLB.pOrderBy)
32eb0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
32ec0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29  nfo->nLevel>=2 )
32ed0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
32ee0 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b  m *pTerm, *pEnd;
32ef0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
32f00 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d  WInfo->a[pWInfo-
32f10 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f  >nLevel-1].pWLoo
32f20 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57  p;.      if( (pW
32f30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32f40 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a  a[pLoop->iTab].j
32f50 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
32f60 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
32f70 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
32f80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
32f90 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
32fa0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
32fb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
32fc0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
32fd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
32fe0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
32ff0 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
33000 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
33010 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
33020 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
33030 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
33040 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
33050 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
33060 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
33070 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
33080 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
33090 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
330a0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
330b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
330c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
330d0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
330e0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
330f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
33100 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
33110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33120 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
33130 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
33140 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
33150 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
33160 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
33170 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
33180 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
33190 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
331a0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
331b0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
331c0 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
331d0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
331e0 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
331f0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
33200 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
33210 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
33220 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
33230 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
33240 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
33250 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
33260 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
33270 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
33280 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
33290 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
332a0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
332b0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
332c0 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
332d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
332e0 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68  nstrains.  ** th
332f0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
33300 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
33310 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
33320 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
33330 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
33340 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
33350 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
33360 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
33370 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
33380 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
33390 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d   .   && (pWInfo-
333a0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
333b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
333c0 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20  EROW)!=0 ){.    
333d0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
333e0 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48  s = 1;.    if( H
333f0 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74  asRowid(pTabList
33400 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[0].pTab) ){.
33410 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
33420 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
33430 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
33440 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _ONLY;.    }.  }
33450 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20  ..  /* Open all 
33460 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54  tables in the pT
33470 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69  abList and any i
33480 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20  ndices selected 
33490 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69  for.  ** searchi
334a0 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  ng those tables.
334b0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
334c0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
334d0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
334e0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
334f0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
33500 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
33510 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
33520 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
33530 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
33540 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
33550 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
33560 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
33570 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
33580 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
33590 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
335a0 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
335b0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
335c0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
335d0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
335e0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
335f0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
33600 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
33610 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
33620 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
33630 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
33640 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
33650 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
33660 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
33670 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
33680 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
33690 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
336a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
336b0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
336c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
336d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
336e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
336f0 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
33700 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
33710 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
33720 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
33730 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
33740 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
33750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33760 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
33770 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
33780 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
33790 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
337a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
337b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
337c0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
337d0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
337e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
337f0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
33800 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
33810 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33820 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
33830 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
33840 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
33850 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
33860 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
33870 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
33880 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
33890 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
338a0 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
338b0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
338c0 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  or;.      };.   
338d0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
338e0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
338f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
33900 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
33910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
33920 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d  bItem->iCursor==
33930 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
33940 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
33950 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
33960 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
33970 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
33980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
33990 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
339a0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
339b0 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
339c0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
339d0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
339e0 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
339f0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
33a00 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
33a10 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
33a20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
33a30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
33a40 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
33a50 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
33a60 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
33a70 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
33a80 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
33a90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
33aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
33ab0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
33ac0 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
33ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
33ae0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
33af0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
33b00 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
33b10 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
33b20 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
33b30 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
33b40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
33b50 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
33b60 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
33b70 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
33b80 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
33b90 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
33ba0 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
33bb0 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  r;.      int op 
33bc0 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
33bd0 20 20 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20       /* iIdxCur 
33be0 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66  is always set if
33bf0 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76   to a positive v
33c00 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20  alue if ONEPASS 
33c10 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  is possible */. 
33c20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64       assert( iId
33c30 78 43 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e  xCur!=0 || (pWIn
33c40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
33c50 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
33c60 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  ESIRED)==0 );.  
33c70 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33c80 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20  okOnePass ){.   
33c90 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d       Index *pJ =
33ca0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
33cb0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  >pIndex;.       
33cc0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64   iIndexCur = iId
33cd0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73  xCur;.        as
33ce0 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73  sert( wctrlFlags
33cf0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
33d00 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20  _DESIRED );.    
33d10 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
33d20 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78  S(pJ) && pJ!=pIx
33d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49   ){.          iI
33d40 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20  ndexCur++;.     
33d50 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e       pJ = pJ->pN
33d60 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
33d70 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
33d80 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
33d90 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
33da0 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64  nePass[1] = iInd
33db0 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  exCur;.      }el
33dc0 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20 26  se if( iIdxCur &
33dd0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
33de0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
33df0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
33e00 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
33e10 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  IdxCur;.      }e
33e20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
33e30 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
33e40 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
33e50 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
33e60 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
33e70 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
33e80 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
33e90 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
33ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
33eb0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
33ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33ed0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49  AddOp3(v, op, iI
33ee0 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  ndexCur, pIx->tn
33ef0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
33f00 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
33f10 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
33f20 70 49 78 29 3b 0a 20 20 20 20 20 20 56 64 62 65  pIx);.      Vdbe
33f30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
33f40 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
33f50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
33f60 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
33f70 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
33f80 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
33f90 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
33fa0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->sMaskSet, pTab
33fb0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
33fc0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
33fd0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
33fe0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
33ff0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34000 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
34010 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
34020 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
34030 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
34040 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
34050 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
34060 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
34070 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
34080 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
34090 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
340a0 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
340b0 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
340c0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
340d0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
340e0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
340f0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
34100 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
34110 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34120 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
34130 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
34140 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
34150 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
34160 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
34170 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
34180 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
34190 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
341a0 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
341b0 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
341c0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
341d0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
341e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
341f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
34200 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
34210 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
34220 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  if.    explainOn
34230 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54  eScan(pParse, pT
34240 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
34250 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
34260 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
34270 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
34280 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
34290 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
342a0 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  ;.    notReady =
342b0 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
342c0 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f  t(pWInfo, ii, no
342d0 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
342e0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
342f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
34300 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e  t;.  }..  /* Don
34310 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  e. */.  VdbeModu
34320 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  leComment((v, "B
34330 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22  egin WHERE-core"
34340 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  ));.  return pWI
34350 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
34360 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
34370 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
34380 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  inError:.  if( p
34390 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61  WInfo ){.    pPa
343a0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
343b0 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
343c0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77  QueryLoop;.    w
343d0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
343e0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pWInfo);.  }.  
343f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
34400 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
34410 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
34420 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
34430 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
34440 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
34450 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
34460 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
34470 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
34480 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
34490 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
344a0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
344b0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
344c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
344d0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
344e0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
344f0 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
34500 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
34510 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
34520 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
34530 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
34540 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
34550 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
34560 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
34570 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ..  */.  VdbeMod
34580 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
34590 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29  End WHERE-core")
345a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
345b0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
345c0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e  e);.  for(i=pWIn
345d0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
345e0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; i--){.    in
345f0 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76  t addr;.    pLev
34600 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
34610 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  i];.    pLoop = 
34620 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
34630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
34640 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
34650 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
34660 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
34670 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
34680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34690 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76  beAddOp3(v, pLev
346a0 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
346b0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20  p1, pLevel->p2, 
346c0 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20  pLevel->p3);.   
346d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
346e0 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
346f0 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
34700 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
34710 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
34720 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
34730 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
34740 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
34750 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
34760 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
34770 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34780 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
34790 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
347a0 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
347b0 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
347c0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
347d0 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
347e0 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
347f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34800 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
34810 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
34820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34830 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
34840 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
34850 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
34860 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34870 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
34880 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
34890 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
348a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
348b0 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
348c0 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
348d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
348e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
348f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
34900 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
34910 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20  l->addrSkip ){. 
34920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
34940 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
34950 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56  drSkip);.      V
34960 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34970 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f  next skip-scan o
34980 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  n %s", pLoop->u.
34990 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
349a0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
349b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
349c0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
349d0 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Skip);.      sql
349e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
349f0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
34a00 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20  Skip-2);.    }. 
34a10 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
34a20 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
34a30 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
34a40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34a50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
34a60 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
34a70 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
34a80 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
34a90 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
34aa0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
34ab0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
34ac0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
34ad0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
34ae0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
34af0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
34b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
34b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
34b20 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
34b30 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
34b40 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
34b50 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
34b60 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
34b70 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
34b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34b90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
34ba0 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
34bb0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
34bc0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
34bd0 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
34be0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34bf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34c00 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
34c10 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
34c20 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
34c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
34c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34c50 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
34c60 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
34c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34c80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34c90 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
34ca0 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64     }.    VdbeMod
34cb0 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
34cc0 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64  End WHERE-loop%d
34cd0 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20  : %s", i,.      
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
34cf0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
34d00 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
34d10 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ].pTab->zName));
34d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
34d30 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
34d40 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
34d50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
34d60 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
34d70 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
34d80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
34d90 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
34da0 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73  ->iBreak);..  as
34db0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
34dc0 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e  evel<=pTabList->
34dd0 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nSrc );.  for(i=
34de0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
34df0 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  ->a; i<pWInfo->n
34e00 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76  Level; i++, pLev
34e10 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
34e20 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
34e30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
34e40 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
34e50 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
34e60 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
34e70 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
34e80 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
34e90 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
34ea0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
34eb0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
34ec0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  ;..    /* Close 
34ed0 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
34ee0 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
34ef0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
34f00 65 72 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a  ereBegin..    **
34f10 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
34f20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 74 68  close cursors th
34f30 61 74 20 77 69 6c 6c 20 62 65 20 72 65 75 73 65  at will be reuse
34f40 64 20 62 79 20 74 68 65 20 4f 52 20 6f 70 74 69  d by the OR opti
34f50 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
34f60 28 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e  (WHERE_OMIT_OPEN
34f70 5f 43 4c 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f  _CLOSE).  And do
34f80 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20 4f   not close the O
34f90 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72 73  P_OpenWrite curs
34fa0 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  ors.    ** creat
34fb0 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50 41  ed for the ONEPA
34fc0 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
34fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34fe0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
34ff0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
35000 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d  =0.     && pTab-
35010 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20  >pSelect==0.    
35020 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
35030 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35040 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
35050 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
35060 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d   int ws = pLoop-
35070 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
35080 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
35090 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
350a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
350b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
350c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
350d0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
350e0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
350f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35100 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
35110 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
35120 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52    && (ws & (WHER
35130 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f  E_IPK|WHERE_AUTO
35140 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20  _INDEX))==0 .   
35150 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69      && pLevel->i
35160 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e  IdxCur!=pWInfo->
35170 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a  aiCurOnePass[1].
35180 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
351a0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
351b0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
351c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
351d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
351e0 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
351f0 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f  ex, make VDBE co
35200 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
35210 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
35220 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
35230 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66  dex instead of f
35240 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68  rom the table wh
35250 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  ere possible.  I
35260 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20  n some cases.   
35270 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a   ** this optimiz
35280 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74  ation prevents t
35290 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76  he table from ev
352a0 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77  er being read, w
352b0 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20  hich can.    ** 
352c0 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63  yield a signific
352d0 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ant performance 
352e0 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20  boost..    ** . 
352f0 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
35300 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
35310 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
35320 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
35330 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
35340 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
35350 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
35360 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
35370 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
35380 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
35390 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
353a0 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
353b0 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
353c0 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
353d0 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
353e0 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
353f0 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
35400 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
35410 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
35420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
35430 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
35440 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48  WHERE_INDEXED|WH
35450 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
35460 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
35470 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
35480 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  dex;.    }else i
35490 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
354a0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
354b0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OR ){.      pIdx
354c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f   = pLevel->u.pCo
354d0 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vidx;.    }.    
354e0 69 66 28 20 70 49 64 78 20 26 26 20 21 64 62 2d  if( pIdx && !db-
354f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
35500 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61  .      int k, la
35510 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
35520 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20 6c 61   *pOp;..      la
35530 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
35540 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
35550 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c        k = pLevel
35560 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20  ->addrBody;.    
35570 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
35580 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a  dbeGetOp(v, k);.
35590 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61        for(; k<la
355a0 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
355b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
355c0 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
355d0 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
355e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
355f0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
35600 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
35610 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70    int x = pOp->p
35620 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  2;.          ass
35630 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c  ert( pIdx->pTabl
35640 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  e==pTab );.     
35650 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
35660 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
35670 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
35680 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
35690 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
356a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
356b0 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
356c0 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  [x];.          }
356d0 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
356e0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
356f0 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20  dex(pIdx, x);.  
35700 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30          if( x>=0
35710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35720 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20  pOp->p2 = x;.   
35730 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
35740 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
35750 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ur;.          }.
35760 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
35770 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
35780 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
35790 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29  LY)==0 || x>=0 )
357a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
357b0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
357c0 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
357d0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
357e0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
357f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
35800 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
35810 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
35820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35830 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
35840 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
35850 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
35860 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
35870 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
35880 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
35890 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
358a0 6e 3b 0a 7d 0a                                   n;.}.