/ Hex Artifact Content
Login

Artifact eed0b83bd7ffef4ac2f7a2fcc9dcfa66b18b8b9e:


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 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
0660: 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b  >iContinue!=0 );
0670: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
0680: 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  ->iContinue;.}..
0690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
06a0: 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72   VDBE address or
06b0: 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
06c0: 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  o in order to br
06d0: 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20  eak.** out of a 
06e0: 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  WHERE loop..*/.i
06f0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  nt sqlite3WhereB
0700: 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49  reakLabel(WhereI
0710: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
0720: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0730: 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Break;.}../*.** 
0740: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
0750: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
0760: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  TE statement can
0770: 20 6f 70 65 72 61 74 65 20 64 69 72 65 63 74 6c   operate directl
0780: 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69  y on.** the rowi
0790: 64 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  ds returned by a
07a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
07b0: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
07c0: 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41  doing an.** UPDA
07d0: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67  TE or DELETE mig
07e0: 68 74 20 63 68 61 6e 67 65 20 73 75 62 73 65 71  ht change subseq
07f0: 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  uent WHERE claus
0800: 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a  e results..**.**
0810: 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20   If the ONEPASS 
0820: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
0830: 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f  used (if this ro
0840: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72  utine returns tr
0850: 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f  ue).** then also
0860: 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63   write the indic
0870: 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f  es of open curso
0880: 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41  rs used by ONEPA
0890: 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72  SS.** into aiCur
08a0: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
08b0: 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73  .  iaCur[0] gets
08c0: 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   the cursor of t
08d0: 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65  he data.** table
08e0: 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65   and iaCur[1] ge
08f0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73  ts the cursor us
0900: 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61  ed by an auxilia
0910: 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74  ry index..** Eit
0920: 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65  her value may be
0930: 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20   -1, indicating 
0940: 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e  that cursor is n
0950: 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20  ot used..** Any 
0960: 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64  cursors returned
0970: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
0980: 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
0990: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b  ng..**.** aiCur[
09a0: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20  0] and aiCur[1] 
09b0: 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74  both get -1 if t
09c0: 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20  he where-clause 
09d0: 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62  logic is.** unab
09e0: 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e  le to use the ON
09f0: 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69  EPASS optimizati
0a00: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
0a10: 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73  e3WhereOkOnePass
0a20: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0a30: 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b  fo, int *aiCur){
0a40: 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c  .  memcpy(aiCur,
0a50: 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
0a60: 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e  ePass, sizeof(in
0a70: 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  t)*2);.  return 
0a80: 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
0a90: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  s;.}../*.** Move
0aa0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
0ab0: 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a  pSrc into pDest.
0ac0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
0ad0: 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65  hereOrMove(Where
0ae0: 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68  OrSet *pDest, Wh
0af0: 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b  ereOrSet *pSrc){
0b00: 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53  .  pDest->n = pS
0b10: 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  rc->n;.  memcpy(
0b20: 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e  pDest->a, pSrc->
0b30: 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65  a, pDest->n*size
0b40: 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29  of(pDest->a[0]))
0b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
0b60: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70  o insert a new p
0b70: 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74  rerequisite/cost
0b80: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
0b90: 57 68 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e  WhereOrSet pSet.
0ba0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65  .**.** The new e
0bb0: 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77  ntry might overw
0bc0: 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
0bd0: 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69   entry, or it mi
0be0: 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64  ght be.** append
0bf0: 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ed, or it might 
0c00: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 44  be discarded.  D
0c10: 6f 20 77 68 61 74 65 76 65 72 20 69 73 20 74 68  o whatever is th
0c20: 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a  e right thing.**
0c30: 20 73 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65   so that pSet ke
0c40: 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53  eps the N_OR_COS
0c50: 54 20 62 65 73 74 20 65 6e 74 72 69 65 73 20 73  T best entries s
0c60: 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73  een so far..*/.s
0c70: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f  tatic int whereO
0c80: 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65  rInsert(.  Where
0c90: 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20  OrSet *pSet,    
0ca0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72    /* The WhereOr
0cb0: 53 65 74 20 74 6f 20 62 65 20 75 70 64 61 74 65  Set to be update
0cc0: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
0cd0: 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a  rereq,        /*
0ce0: 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   Prerequisites o
0cf0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
0d00: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e  */.  LogEst rRun
0d10: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
0d20: 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e  un-cost of the n
0d30: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f  ew entry */.  Lo
0d40: 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20  gEst nOut       
0d50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0d60: 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68  f outputs for th
0d70: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29  e new entry */.)
0d80: 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65  {.  u16 i;.  Whe
0d90: 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66  reOrCost *p;.  f
0da0: 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d  or(i=pSet->n, p=
0db0: 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSet->a; i>0; i-
0dc0: 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, p++){.    if(
0dd0: 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26   rRun<=p->rRun &
0de0: 26 20 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70  & (prereq & p->p
0df0: 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29  rereq)==prereq )
0e00: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65  {.      goto whe
0e10: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b  reOrInsert_done;
0e20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
0e30: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20  ->rRun<=rRun && 
0e40: 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65  (p->prereq & pre
0e50: 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
0e60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0e70: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
0e80: 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f  f( pSet->n<N_OR_
0e90: 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20  COST ){.    p = 
0ea0: 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e  &pSet->a[pSet->n
0eb0: 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74  ++];.    p->nOut
0ec0: 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65   = nOut;.  }else
0ed0: 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e  {.    p = pSet->
0ee0: 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  a;.    for(i=1; 
0ef0: 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pSet->n; i++){
0f00: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52  .      if( p->rR
0f10: 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52  un>pSet->a[i].rR
0f20: 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61  un ) p = pSet->a
0f30: 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + i;.    }.    
0f40: 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75  if( p->rRun<=rRu
0f50: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
0f60: 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f  }.whereOrInsert_
0f70: 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65  done:.  p->prere
0f80: 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d  q = prereq;.  p-
0f90: 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20  >rRun = rRun;.  
0fa0: 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  if( p->nOut>nOut
0fb0: 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75   ) p->nOut = nOu
0fc0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
0fd0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0fe0: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  ze a preallocate
0ff0: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  d WhereClause st
1000: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
1010: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
1020: 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65  useInit(.  Where
1030: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
1040: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
1050: 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69  Clause to be ini
1060: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68  tialized */.  Wh
1070: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1080: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1090: 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63  ERE processing c
10a0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70  ontext */.){.  p
10b0: 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WC->pWInfo = pWI
10c0: 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74  nfo;.  pWC->pOut
10d0: 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  er = 0;.  pWC->n
10e0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
10f0: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
1100: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
1110: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
1120: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a  ->aStatic;.}../*
1130: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1140: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
1150: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1160: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
1170: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
1180: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
1190: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
11a0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
11b0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
11c0: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
11d0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
11e0: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
11f0: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
1200: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
1210: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1220: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
1230: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
1240: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1250: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
1260: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
1270: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
1280: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
1290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
12a0: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
12b0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
12c0: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
12d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
12f0: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
1300: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
1310: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
1320: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
1330: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
1340: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1350: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
1360: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
1370: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
1380: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1390: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
13a0: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
13b0: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
13c0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
13d0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
13e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
13f0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
1400: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
1410: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
1420: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
1430: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
1440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1450: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
1460: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
1470: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
1480: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
1490: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
14a0: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
14b0: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
14c0: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
14d0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
14e0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
14f0: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
1500: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
1510: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
1520: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
1530: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
1540: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1550: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
1560: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
1570: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
1580: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
1590: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
15a0: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
15b0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
15c0: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
15d0: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
15e0: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
15f0: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
1600: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
1610: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
1620: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1630: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
1640: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1650: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
1660: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
1670: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
1680: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
1690: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
16a0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
16b0: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
16c0: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
16d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16e0: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
16f0: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
1700: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
1710: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
1720: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
1730: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
1740: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
1750: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
1770: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
1780: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
1790: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
17a0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
17b0: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
17c0: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
17d0: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
17e0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
17f0: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
1800: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
1810: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
1820: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
1830: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
1840: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
1850: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
1860: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
1870: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
1880: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
1890: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
18a0: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
18b0: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
18c0: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
18d0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
18e0: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
18f0: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
1900: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
1910: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
1920: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
1930: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1940: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
1950: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
1960: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
1970: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
1980: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
1990: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
19a0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
19b0: 49 52 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20  IRTUAL );.  if( 
19c0: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
19d0: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
19e0: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
19f0: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69  pWC->a;.    sqli
1a00: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
1a10: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1a20: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
1a30: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1a40: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
1a50: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
1a60: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
1a70: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
1a80: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
1a90: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
1aa0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ab0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1ac0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
1ad0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
1ae0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1af0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
1b00: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
1b10: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1b20: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
1b30: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
1b40: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
1b50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1b60: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
1b70: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
1b80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1b90: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
1ba0: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
1bb0: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
1bc0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
1bd0: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
1be0: 0a 20 20 69 66 28 20 70 20 26 26 20 45 78 70 72  .  if( p && Expr
1bf0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
1c00: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
1c10: 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50     pTerm->truthP
1c20: 72 6f 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  rob = sqlite3Log
1c30: 45 73 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d  Est(p->iTable) -
1c40: 20 39 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   99;.  }else{.  
1c50: 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72    pTerm->truthPr
1c60: 6f 62 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70  ob = -1;.  }.  p
1c70: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Term->pExpr = sq
1c80: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1c90: 6c 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d  late(p);.  pTerm
1ca0: 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c  ->wtFlags = wtFl
1cb0: 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57  ags;.  pTerm->pW
1cc0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d  C = pWC;.  pTerm
1cd0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
1ce0: 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a    return idx;.}.
1cf0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1d00: 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73  ine identifies s
1d10: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  ubexpressions in
1d20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d30: 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20  e where.** each 
1d40: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
1d50: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68   separated by th
1d60: 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f  e AND operator o
1d70: 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
1d80: 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69  operator specifi
1d90: 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72  ed in the op par
1da0: 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65  ameter.  The Whe
1db0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1dc0: 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  re.** is filled 
1dd0: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
1de0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
1df0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
1e00: 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61  *.**    WHERE  a
1e10: 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f  =='hello' AND co
1e20: 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20  alesce(b,11)<10 
1e30: 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20  AND (c+12!=d OR 
1e40: 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20  c==22).**       
1e50: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20      \________/  
1e60: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1e70: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
1e80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
1e90: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30            slot[0
1ea0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  ]            slo
1eb0: 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[1]            
1ec0: 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a     slot[2].**.**
1ed0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   The original WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45  ERE clause in pE
1ef0: 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64  xpr is unaltered
1f00: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
1f10: 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d  ine.** does is m
1f20: 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69  ake slot[] entri
1f30: 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73  es point to subs
1f40: 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20  tructure within 
1f50: 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pExpr..**.** In 
1f60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
1f70: 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65  tence and in the
1f80: 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b   diagram, "slot[
1f90: 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20  ]" refers to.** 
1fa0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e  the WhereClause.
1fb0: 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20  a[] array.  The 
1fc0: 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f  slot[] array gro
1fd0: 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20  ws as needed to 
1fe0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74  contain.** all t
1ff0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2000: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  E clause..*/.sta
2010: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70  tic void whereSp
2020: 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  lit(WhereClause 
2030: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pWC, Expr *pExp
2040: 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43  r, u8 op){.  pWC
2050: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28  ->op = op;.  if(
2060: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
2070: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
2080: 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77  >op!=op ){.    w
2090: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
20a0: 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b  (pWC, pExpr, 0);
20b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
20c0: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
20d0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b  xpr->pLeft, op);
20e0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
20f0: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  pWC, pExpr->pRig
2100: 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ht, op);.  }.}..
2110: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2120: 20 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20   a WhereMaskSet 
2130: 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e  object.*/.#defin
2140: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
2150: 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a    (P)->n=0../*.*
2160: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
2170: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
2180: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
2190: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
21a0: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
21b0: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
21c0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
21d0: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
21e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
21f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
2200: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
2210: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e  pMaskSet->n<=(in
2220: 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  t)sizeof(Bitmask
2230: 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  )*8 );.  for(i=0
2240: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
2250: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2260: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
2270: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
2280: 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28   return MASKBIT(
2290: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
22a0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
22b0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
22c0: 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20  mask for cursor 
22d0: 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  iCursor..**.** T
22e0: 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73  here is one curs
22f0: 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20  or per table in 
2300: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2310: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a    The number of.
2320: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
2330: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2340: 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73  limited by a tes
2350: 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a  t early in the.*
2360: 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
2370: 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20  gin() routine.  
2380: 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  So we know that 
2390: 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  the pMaskSet->ix
23a0: 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c  [].** array will
23b0: 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e   never overflow.
23c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23d0: 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65  createMask(Where
23e0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
23f0: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
2400: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
2410: 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69  Set->n < ArraySi
2420: 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29  ze(pMaskSet->ix)
2430: 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e   );.  pMaskSet->
2440: 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b  ix[pMaskSet->n++
2450: 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a  ] = iCursor;.}..
2460: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  /*.** These rout
2470: 69 6e 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72  ines walk (recur
2480: 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65  sively) an expre
2490: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67  ssion tree and g
24a0: 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74  enerate.** a bit
24b0: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20  mask indicating 
24c0: 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  which tables are
24d0: 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78   used in that ex
24e0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
24f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
2500: 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c  ask exprListTabl
2510: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2520: 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29  Set*, ExprList*)
2530: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
2540: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
2550: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2560: 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73  et*, Select*);.s
2570: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2580: 70 72 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  prTableUsage(Whe
2590: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
25a0: 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  Set, Expr *p){. 
25b0: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
25c0: 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
25d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
25e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
25f0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67   ){.    mask = g
2600: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
2610: 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20   p->iTable);.   
2620: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20   return mask;.  
2630: 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54  }.  mask = exprT
2640: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2650: 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  et, p->pRight);.
2660: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
2670: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2680: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t, p->pLeft);.  
2690: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
26a0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
26b0: 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b  ect) ){.    mask
26c0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
26d0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
26e0: 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  t, p->x.pSelect)
26f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
2700: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2710: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2720: 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  et, p->x.pList);
2730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
2740: 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74  sk;.}.static Bit
2750: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
2760: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
2770: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2780: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2790: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74  {.  int i;.  Bit
27a0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
27b0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
27c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
27d0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
27e0: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  .      mask |= e
27f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2800: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
2810: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2820: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
2830: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
2840: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
2850: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
2860: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2870: 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a  t, Select *pS){.
2880: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
2890: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20   0;.  while( pS 
28a0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
28b0: 70 53 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b  pSrc = pS->pSrc;
28c0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
28d0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
28e0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45  pMaskSet, pS->pE
28f0: 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20  List);.    mask 
2900: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2910: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2920: 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  pS->pGroupBy);. 
2930: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
2940: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
2950: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64  askSet, pS->pOrd
2960: 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  erBy);.    mask 
2970: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2980: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2990: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73  pWhere);.    mas
29a0: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
29b0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
29c0: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
29d0: 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 21  if( ALWAYS(pSrc!
29e0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =0) ){.      int
29f0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
2a00: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
2a10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   i++){.        m
2a20: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
2a30: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2a40: 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d  kSet, pSrc->a[i]
2a50: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
2a60: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
2a70: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2a80: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
2a90: 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  On);.      }.   
2aa0: 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e   }.    pS = pS->
2ab0: 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  pPrior;.  }.  re
2ac0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  turn mask;.}../*
2ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2ae0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65  if the given ope
2af0: 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20  rator is one of 
2b00: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
2b10: 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64  at is.** allowed
2b20: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c   for an indexabl
2b30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2b40: 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65  erm.  The allowe
2b50: 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a  d operators are.
2b60: 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22  ** "=", "<", ">"
2b70: 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49  , "<=", ">=", "I
2b80: 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c  N", and "IS NULL
2b90: 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ".*/.static int 
2ba0: 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70  allowedOp(int op
2bb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  ){.  assert( TK_
2bc0: 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47  GT>TK_EQ && TK_G
2bd0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
2be0: 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51  ert( TK_LT>TK_EQ
2bf0: 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20   && TK_LT<TK_GE 
2c00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
2c10: 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LE>TK_EQ && TK_L
2c20: 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  E<TK_GE );.  ass
2c30: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45  ert( TK_GE==TK_E
2c40: 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Q+4 );.  return 
2c50: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70  op==TK_IN || (op
2c60: 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54  >=TK_EQ && op<=T
2c70: 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_GE) || op==TK_
2c80: 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ISNULL;.}../*.**
2c90: 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74   Swap two object
2ca0: 73 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a  s of type TYPE..
2cb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28  */.#define SWAP(
2cc0: 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20  TYPE,A,B) {TYPE 
2cd0: 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a  t=A; A=B; B=t;}.
2ce0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61  ./*.** Commute a
2cf0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
2d00: 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f  ator.  Expressio
2d10: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ns of the form "
2d20: 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63  X op Y".** are c
2d30: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59  onverted into "Y
2d40: 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66   op X"..**.** If
2d50: 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65 63   left/right prec
2d60: 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d  edence rules com
2d70: 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e  e into play when
2d80: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65   determining the
2d90: 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  .** collating se
2da0: 71 75 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c  quence, then COL
2db0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61  LATE operators a
2dc0: 72 65 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65  re adjusted to e
2dd0: 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68  nsure.** that th
2de0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
2df0: 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  ence does not ch
2e00: 61 6e 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  ange.  For examp
2e10: 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74  le:.** "Y collat
2e20: 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62  e NOCASE op X" b
2e30: 65 63 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20  ecomes "X op Y" 
2e40: 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c  because any coll
2e50: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
2e60: 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61  n.** the left ha
2e70: 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d  nd side of a com
2e80: 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65  parison override
2e90: 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  s any collation 
2ea0: 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74  sequence .** att
2eb0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67  ached to the rig
2ec0: 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65  ht. For the same
2ed0: 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43   reason the EP_C
2ee0: 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69  ollate flag.** i
2ef0: 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a  s not commuted..
2f00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
2f10: 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65  xprCommute(Parse
2f20: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2f30: 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78  pExpr){.  u16 ex
2f40: 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d  pRight = (pExpr-
2f50: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
2f60: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2f70: 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70  u16 expLeft = (p
2f80: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
2f90: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
2fa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
2fb0: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
2fc0: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
2fd0: 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78  K_IN );.  if( ex
2fe0: 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20  pRight==expLeft 
2ff0: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
3000: 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61   X and Y both ha
3010: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
3020: 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64  tor or neither d
3030: 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70  o */.    if( exp
3040: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f  Right ){.      /
3050: 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68  * Both X and Y h
3060: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
3070: 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72  ators.  Make sur
3080: 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20  e X is always.  
3090: 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63      ** used by c
30a0: 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43  learing the EP_C
30b0: 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d  ollate flag from
30c0: 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78   Y. */.      pEx
30d0: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
30e0: 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65  s &= ~EP_Collate
30f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3100: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
3110: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
3120: 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
3130: 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20       /* Neither 
3140: 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c  X nor Y have COL
3150: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20  LATE operators, 
3160: 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d  but X has a non-
3170: 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a  default.      **
3180: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3190: 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65  nce.  So add the
31a0: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b   EP_Collate mark
31b0: 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65  er on X to cause
31c0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  .      ** it to 
31d0: 62 65 20 73 65 61 72 63 68 65 64 20 66 69 72 73  be searched firs
31e0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70  t. */.      pExp
31f0: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
3200: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20  |= EP_Collate;. 
3210: 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28     }.  }.  SWAP(
3220: 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69  Expr*,pExpr->pRi
3230: 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  ght,pExpr->pLeft
3240: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
3250: 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op>=TK_GT ){.   
3260: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
3270: 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61  TK_GT+2 );.    a
3280: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
3290: 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _LE+2 );.    ass
32a0: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
32b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32c0: 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20  TK_GT<TK_LE );. 
32d0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
32e0: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70  ->op>=TK_GT && p
32f0: 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20  Expr->op<=TK_GE 
3300: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
3310: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54   = ((pExpr->op-T
3320: 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a  K_GT)^2)+TK_GT;.
3330: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61    }.}../*.** Tra
3340: 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78  nslate from TK_x
3350: 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f  x operator to WO
3360: 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a  _xx bitmask..*/.
3370: 73 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61  static u16 opera
3380: 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b  torMask(int op){
3390: 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65  .  u16 c;.  asse
33a0: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  rt( allowedOp(op
33b0: 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  ) );.  if( op==T
33c0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20  K_IN ){.    c = 
33d0: 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_IN;.  }else i
33e0: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
33f0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
3400: 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  SNULL;.  }else{.
3410: 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f      assert( (WO_
3420: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20  EQ<<(op-TK_EQ)) 
3430: 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  < 0x7fff );.    
3440: 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c  c = (u16)(WO_EQ<
3450: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20  <(op-TK_EQ));.  
3460: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  }.  assert( op!=
3470: 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d  TK_ISNULL || c==
3480: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61  WO_ISNULL );.  a
3490: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e  ssert( op!=TK_IN
34a0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a   || c==WO_IN );.
34b0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
34c0: 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20  _EQ || c==WO_EQ 
34d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
34e0: 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LT || c==WO_
34f0: 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LT );.  assert( 
3500: 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d  op!=TK_LE || c==
3510: 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72  WO_LE );.  asser
3520: 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  t( op!=TK_GT || 
3530: 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73  c==WO_GT );.  as
3540: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20  sert( op!=TK_GE 
3550: 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20  || c==WO_GE );. 
3560: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
3570: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  .** Advance to t
3580: 68 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72  he next WhereTer
3590: 6d 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  m that matches a
35a0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
35b0: 63 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61  criteria.** esta
35c0: 62 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65  blished when the
35d0: 20 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61   pScan object wa
35e0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  s initialized by
35f0: 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29   whereScanInit()
3600: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
3610: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
3620: 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57   more matching W
3630: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74  hereTerms..*/.st
3640: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
3650: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68  whereScanNext(Wh
3660: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b  ereScan *pScan){
3670: 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
3680: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3690: 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ursor on the LHS
36a0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
36b0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
36c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
36d0: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20  lumn on the LHS 
36e0: 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31  of the term.  -1
36f0: 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78   for IPK */.  Ex
3700: 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
3710: 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
3720: 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64  ion being tested
3730: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3740: 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68  e *pWC;    /* Sh
3750: 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61  orthand for pSca
3760: 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72  n->pWC */.  Wher
3770: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
3780: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69   /* The term bei
3790: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  ng tested */.  i
37a0: 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b  nt k = pScan->k;
37b0: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
37c0: 73 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a  start scanning *
37d0: 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61  /..  while( pSca
37e0: 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e  n->iEquiv<=pScan
37f0: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
3800: 69 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45  iCur = pScan->aE
3810: 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75  quiv[pScan->iEqu
3820: 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75  iv-2];.    iColu
3830: 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  mn = pScan->aEqu
3840: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
3850: 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  -1];.    while( 
3860: 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  (pWC = pScan->pW
3870: 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  C)!=0 ){.      f
3880: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
3890: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
38a0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
38b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
38c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
38d0: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
38e0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
38f0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
3900: 20 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d        && (pScan-
3910: 3e 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45  >iEquiv<=2 || !E
3920: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
3930: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
3940: 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20  FromJoin)).     
3950: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
3960: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
3970: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
3980: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
3990: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
39a0: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
39b0: 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  ->aEquiv).      
39c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
39d0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
39e0: 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74        pX = sqlit
39f0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
3a00: 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
3a10: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
3a20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
3a30: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
3a40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
3a50: 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e  r(j=0; j<pScan->
3a60: 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20  nEquiv; j+=2){. 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
3a80: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
3a90: 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20  ]==pX->iTable.  
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3ab0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
3ac0: 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20  1]==pX->iColumn 
3ad0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3af0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3b00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3b10: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63        if( j==pSc
3b20: 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20  an->nEquiv ){.  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
3b40: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70  n->aEquiv[j] = p
3b50: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
3b60: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
3b70: 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58  aEquiv[j+1] = pX
3b80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
3b90: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
3ba0: 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20  nEquiv += 2;.   
3bb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bd0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
3be0: 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e  erator & pScan->
3bf0: 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  opMask)!=0 ){.  
3c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
3c10: 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ify the affinity
3c20: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
3c30: 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f  equence match */
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3c50: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
3c60: 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70  e && (pTerm->eOp
3c70: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
3c80: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
3c90: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
3ca0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
3cb0: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
3cc0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  rse = pWC->pWInf
3cd0: 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  o->pParse;.     
3ce0: 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54           pX = pT
3cf0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
3d00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
3d10: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
3d20: 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d  ityOk(pX, pScan-
3d30: 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20  >idxaff) ){.    
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
3d50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
3d60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3d70: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
3d80: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
3d90: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
3da0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
3db0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
3dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58     pX->pLeft, pX
3e00: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
3e10: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
3e20: 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
3e30: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
3e40: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
3e50: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3e60: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
3e70: 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f  Name, pScan->zCo
3e80: 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  llName) ){.     
3e90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
3ea0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
3eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3ec0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
3ed0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
3ee0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30  ator & WO_EQ)!=0
3ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
3f00: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
3f10: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
3f20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
3f30: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
3f40: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
3f50: 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20  Equiv[0].       
3f60: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f        && pX->iCo
3f70: 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  lumn==pScan->aEq
3f80: 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20  uiv[1].         
3f90: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
3fa0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3fb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fc0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b          pScan->k
3fd0: 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20   = k+1;.        
3fe0: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
3ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4010: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
4020: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70   = pScan->pWC->p
4030: 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d  Outer;.      k =
4040: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
4050: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e  can->pWC = pScan
4060: 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b  ->pOrigWC;.    k
4070: 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d   = 0;.    pScan-
4080: 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >iEquiv += 2;.  
4090: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
40a0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
40b0: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
40c0: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
40d0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
40e0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
40f0: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
4100: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
4110: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
4120: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
4130: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
4140: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
4150: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
4160: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
4170: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4180: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
4190: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
41a0: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
41b0: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
41c0: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
41d0: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
41e0: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
41f0: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
4200: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
4210: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
4220: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
4230: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
4240: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
4250: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
4260: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
4270: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
4280: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
4290: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
42a0: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
42b0: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
42c0: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
42d0: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
42e0: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
42f0: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
4300: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
4310: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
4320: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
4330: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
4340: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
4350: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
4360: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
4370: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
4380: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
4390: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
43a0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
43b0: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
43c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
43d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
43e0: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
43f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
4400: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
4410: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
4420: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
4430: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
4440: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
4450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4460: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
4470: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
4480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4490: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
44a0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
44b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
44c0: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
44d0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
44e0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
44f0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  {.  int j;..  /*
4500: 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30   memset(pScan, 0
4510: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29  , sizeof(*pScan)
4520: 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70  ); */.  pScan->p
4530: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
4540: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
4550: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
4560: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
4570: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
4580: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
4590: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
45a0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
45b0: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
45c0: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
45d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
45e0: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
45f0: 6e 4b 65 79 43 6f 6c 29 20 29 20 72 65 74 75 72  nKeyCol) ) retur
4600: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
4610: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
4620: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
4630: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
4640: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
4650: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
4660: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
4670: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
4680: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
4690: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
46a0: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20  an->aEquiv[0] = 
46b0: 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61  iCur;.  pScan->a
46c0: 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75  Equiv[1] = iColu
46d0: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
46e0: 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e  uiv = 2;.  pScan
46f0: 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->iEquiv = 2;.  
4700: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
4710: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
4720: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
4730: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
4740: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4750: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
4760: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
4770: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
4780: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
4790: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
47a0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
47b0: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
47c0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
47d0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
47e0: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
47f0: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
4800: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4810: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
4820: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
4830: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
4840: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
4850: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
4860: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
4870: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
4880: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
4890: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
48a0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
48b0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
48c0: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
48d0: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
48e0: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
48f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
4900: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
4910: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
4920: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
4930: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
4940: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
4950: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
4960: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
4970: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
4980: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
4990: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
49a0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
49b0: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
49c0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
49d0: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
49e0: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
49f0: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
4a00: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
4a10: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
4a20: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
4a30: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
4a40: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
4a50: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
4a60: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
4a70: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
4a80: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
4a90: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
4aa0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
4ab0: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
4ac0: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
4ad0: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
4ae0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
4af0: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
4b00: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
4b10: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
4b20: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
4b30: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
4b40: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
4b50: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
4b60: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
4b70: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
4b80: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
4b90: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4ba0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
4bb0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
4bc0: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
4bd0: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
4be0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
4bf0: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
4c00: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
4c10: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
4c20: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
4c30: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
4c40: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
4c50: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
4c60: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
4c70: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
4c80: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4c90: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
4ca0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
4cb0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
4cc0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
4cd0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
4ce0: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
4cf0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
4d00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4d10: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
4d20: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4d30: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
4d40: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
4d50: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
4d60: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4d80: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
4d90: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
4da0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
4db0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
4dc0: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
4dd0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
4de0: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
4df0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
4e00: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
4e10: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
4e20: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
4e30: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
4e40: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
4e50: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
4e60: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
4e70: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
4e80: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
4e90: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
4ea0: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
4eb0: 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69   if( p->prereqRi
4ec0: 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f  ght==0 && (p->eO
4ed0: 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
4ee0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
4ef0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
4f00: 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74       if( pResult
4f10: 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20  ==0 ) pResult = 
4f20: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  p;.    }.    p =
4f30: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
4f40: 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  scan);.  }.  ret
4f50: 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn pResult;.}..
4f60: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
4f70: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
4f80: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
4f90: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
4fa0: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
4fb0: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
4fc0: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
4fd0: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
4fe0: 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ause.  .*/.stati
4ff0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
5000: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
5010: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
5020: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
5030: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
5040: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
5050: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
5060: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
5070: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
5080: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
5090: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
50a0: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
50b0: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
50c0: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
50d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
50e0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
50f0: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
5100: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5110: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
5120: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
5130: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
5140: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
5150: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
5160: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
5170: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
5180: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
5190: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
51a0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
51b0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
51c0: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
51d0: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
51e0: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
51f0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
5200: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
5210: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
5220: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
5230: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
5240: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5250: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5260: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5270: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
5280: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
5290: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
52a0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
52b0: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
52c0: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
52d0: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
52e0: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
52f0: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
5300: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
5310: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
5320: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
5330: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
5340: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
5350: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
5360: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
5370: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
5380: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
5390: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
53a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
53b0: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
53c0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
53d0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
53e0: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
53f0: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
5400: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
5410: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
5420: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
5430: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
5440: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
5450: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
5460: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
5490: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
54a0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
54b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
54c0: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
54d0: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
54e0: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
54f0: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
5500: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
5510: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
5520: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5530: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
5540: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
5550: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
5560: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
5570: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5590: 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74  Opcode of pRight
55a0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69   */..  if( !sqli
55b0: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
55c0: 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f  n(db, pExpr, pno
55d0: 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20  Case, wc) ){.   
55e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
55f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43  ifdef SQLITE_EBC
5600: 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61  DIC.  if( *pnoCa
5610: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  se ) return 0;.#
5620: 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20  endif.  pList = 
5630: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
5640: 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d    pLeft = pList-
5650: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[1].pExpr;.  i
5660: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b  f( pLeft->op!=TK
5670: 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73  _COLUMN .   || s
5680: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
5690: 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54  ty(pLeft)!=SQLIT
56a0: 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c  E_AFF_TEXT .   |
56b0: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66  | IsVirtual(pLef
56c0: 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20  t->pTab).  ){.  
56d0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36    /* IMP: R-0206
56e0: 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74  5-49465 The left
56f0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
5700: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  e LIKE or GLOB o
5710: 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20  perator must.   
5720: 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20   ** be the name 
5730: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
5740: 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61  lumn with TEXT a
5750: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
5760: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5770: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69  assert( pLeft->i
5780: 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20  Column!=(-1) ); 
5790: 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e  /* Because IPK n
57a0: 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58  ever has AFF_TEX
57b0: 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d  T */..  pRight =
57c0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
57d0: 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61  Collate(pList->a
57e0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70  [0].pExpr);.  op
57f0: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20   = pRight->op;. 
5800: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
5810: 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65  ABLE ){.    Vdbe
5820: 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70   *pReprepare = p
5830: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
5840: 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  e;.    int iCol 
5850: 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  = pRight->iColum
5860: 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  n;.    pVal = sq
5870: 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
5880: 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  dValue(pReprepar
5890: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
58a0: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
58b0: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
58c0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
58d0: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
58e0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
58f0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
5900: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
5910: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5920: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
5930: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
5940: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
5950: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
5960: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
5970: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
5980: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
5990: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
59a0: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69  G ){.    z = pRi
59b0: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
59c0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20   }.  if( z ){.  
59d0: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
59e0: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
59f0: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
5a00: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
5a10: 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20  !=wc[2] ){.     
5a20: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
5a30: 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20    if( cnt!=0 && 
5a40: 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31  255!=(u8)z[cnt-1
5a50: 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ] ){.      Expr 
5a60: 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20  *pPrefix;.      
5a70: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63  *pisComplete = c
5a80: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
5a90: 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50  +1]==0;.      pP
5aa0: 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45  refix = sqlite3E
5ab0: 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e  xpr(db, TK_STRIN
5ac0: 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  G, z);.      if(
5ad0: 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66   pPrefix ) pPref
5ae0: 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74  ix->u.zToken[cnt
5af0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70  ] = 0;.      *pp
5b00: 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78  Prefix = pPrefix
5b10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
5b20: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
5b30: 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
5b40: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5b60: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c  dbeSetVarmask(v,
5b70: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
5b80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
5b90: 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70  pisComplete && p
5ba0: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
5bb0: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
5bc0: 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66  /* If the rhs of
5bd0: 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73   the LIKE expres
5be0: 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62  sion is a variab
5bf0: 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  le, and the curr
5c00: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ent.          **
5c10: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61   value of the va
5c20: 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65  riable means the
5c30: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
5c40: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45   invoke the LIKE
5c50: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
5c60: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20  nction, then no 
5c70: 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c  OP_Variable will
5c80: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
5c90: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20   program..      
5ca0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73      ** This caus
5cb0: 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  es problems for 
5cc0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
5cd0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
5ce0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ).          ** A
5cf0: 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e  PI. To workaroun
5d00: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
5d10: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
5d20: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
5d30: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
5d40: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5d50: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5d70: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
5d80: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
5d90: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
5da0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5db0: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
5dc0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5dd0: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
5de0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5df0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5e00: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
5e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5e20: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
5e30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
5e40: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
5e50: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
5e60: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
5e70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
5e80: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
5e90: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
5ea0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5eb0: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
5ec0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
5ed0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
5ee0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
5ef0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
5f00: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
5f10: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
5f20: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
5f30: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
5f40: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
5f50: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
5f60: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
5f70: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
5f80: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
5f90: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
5fa0: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
5fb0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
5fc0: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
5fd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5fe0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
5ff0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
6000: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
6010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6020: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
6030: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
6040: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
6050: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
6060: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
6070: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
6080: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
6090: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
60a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
60b0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
60c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
60d0: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
60e0: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
60f0: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
6100: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
6110: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
6120: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
6130: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
6140: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
6150: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
6160: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
6170: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
6180: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
6190: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
61a0: 42 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65  Base){.  if( pDe
61b0: 72 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65  rived ){.    pDe
61c0: 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20  rived->flags |= 
61d0: 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45  pBase->flags & E
61e0: 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
61f0: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
6200: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
6210: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
6220: 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  le;.  }.}..#if !
6230: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6240: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
6250: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
6260: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
6270: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61  QUERY)./*.** Ana
6280: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
6290: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
62a0: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
62b0: 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d  ected.** subterm
62c0: 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a  s.  So in:.**.**
62d0: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20       ... WHERE  
62e0: 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f  (a=5) AND (b=7 O
62f0: 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41  R c=9 OR d=13) A
6300: 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20  ND (d=13).**    
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e        ^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a  ^^^^^^^^^^.**.**
6340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
6350: 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63  alyzes terms suc
6360: 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20  h as the middle 
6370: 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76  term in the abov
6380: 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20  e example..** A 
6390: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
63a0: 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  ct is computed a
63b0: 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  nd attached to t
63c0: 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a  he term under.**
63d0: 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72   analysis, regar
63e0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
63f0: 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c  come of the anal
6400: 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a  ysis.  Hence:.**
6410: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6420: 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20  m.wtFlags   |=  
6430: 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20  TERM_ORINFO.**  
6440: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
6450: 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e  OrInfo  =  a dyn
6460: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
6470: 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f  ed WhereOrTerm o
6480: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
6490: 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
64a0: 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77  zed must have tw
64b0: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d  o or more of OR-
64c0: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
64d0: 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  ms..** A single 
64e0: 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65  subterm might be
64f0: 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f   a set of AND-co
6500: 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74  nnected sub-subt
6510: 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  erms..** Example
6520: 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72  s of terms under
6530: 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a   analysis:.**.**
6540: 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e       (A)     t1.
6550: 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74  x=t2.y OR t1.x=t
6560: 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f  2.z OR t1.y=15 O
6570: 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a  R t1.z=t3.a+5.**
6580: 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65       (B)     x=e
6590: 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20  xpr1 OR expr2=x 
65a0: 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20  OR x=expr3.**   
65b0: 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74    (C)     t1.x=t
65c0: 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e  2.y OR (t1.x=t2.
65d0: 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a  z AND t1.y=15).*
65e0: 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d  *     (D)     x=
65f0: 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41  expr1 OR (y>11 A
6600: 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49  ND y<22 AND z LI
6610: 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a  KE '*hello*').**
6620: 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e       (E)     (p.
6630: 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e  a=1 AND q.b=2 AN
6640: 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78  D r.c=3) OR (p.x
6650: 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44  =4 AND q.y=5 AND
6660: 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41   r.z=6).**.** CA
6670: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
6680: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
6690: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
66a0: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
66b0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
66c0: 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65   and.** a single
66d0: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
66e0: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
66f0: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
6700: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
6710: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
6720: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
6730: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
6740: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
6750: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
6760: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
6770: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
6780: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
6790: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
67a0: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
67b0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
67c0: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
67d0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
67e0: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
67f0: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
6800: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 2:.**.** If a
6810: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
6820: 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73  indexable by a s
6830: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74  ingle table T, t
6840: 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20  hen set.**.**   
6850: 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65    WhereTerm.eOpe
6860: 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20  rator           
6870: 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20     =  WO_OR.**  
6880: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
6890: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
68a0: 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f  e  |=  the curso
68b0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
68c0: 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62  le T.**.** A sub
68d0: 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62  term is "indexab
68e0: 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20  le" if it is of 
68f0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43  the form.** "T.C
6900: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
6910: 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c  ere C is any col
6920: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61  umn of table T a
6930: 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f  nd .** <op> is o
6940: 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20  ne of "=", "<", 
6950: 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c  "<=", ">", ">=",
6960: 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22   "IS NULL", or "
6970: 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72  IN"..** A subter
6980: 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61  m is also indexa
6990: 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20  ble if it is an 
69a0: 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  AND of two or mo
69b0: 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d  re.** subsubterm
69c0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
69d0: 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78  f which is index
69e0: 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65  able.  Indexable
69f0: 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d   AND .** subterm
6a00: 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70  s have their eOp
6a10: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f  erator set to WO
6a20: 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61  _AND and they ha
6a30: 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f  ve.** u.pAndInfo
6a40: 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69   set to a dynami
6a50: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
6a60: 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a  WhereAndTerm obj
6a70: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20  ect..**.** From 
6a80: 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66  another point of
6a90: 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c   view, "indexabl
6aa0: 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  e" means that th
6ab0: 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a  e subterm could.
6ac0: 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62  ** potentially b
6ad0: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
6ae0: 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f  ndex if an appro
6af0: 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69  priate index exi
6b00: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61  sts..** This ana
6b10: 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63  lysis does not c
6b20: 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20  onsider whether 
6b30: 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78  or not the index
6b40: 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a   exists; that.**
6b50: 20 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65   is decided else
6b60: 77 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61  where.  This ana
6b70: 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  lysis only looks
6b80: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
6b90: 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  erms.** appropri
6ba0: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
6bb0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
6bc0: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
6bd0: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74  ough E above sat
6be0: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75  isfy case 2.  Bu
6bf0: 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61  t if a term.** a
6c00: 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63  lso statisfies c
6c10: 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42  ase 1 (such as B
6c20: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
6c30: 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c  he optimizer wil
6c40: 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66  l.** always pref
6c50: 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e  er case 1, so in
6c60: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72   that case we pr
6c70: 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20  etend that case 
6c80: 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69  2 is not.** sati
6c90: 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  sfied..**.** It 
6ca0: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
6cb0: 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  e that multiple 
6cc0: 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78  tables are index
6cd0: 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  able.  For examp
6ce0: 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65  le,.** (E) above
6cf0: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e   is indexable on
6d00: 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e   tables P, Q, an
6d10: 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  d R..**.** Terms
6d20: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
6d30: 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61  se 2 are candida
6d40: 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62  tes for lookup b
6d50: 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72  y using.** separ
6d60: 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66  ate indices to f
6d70: 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65  ind rowids for e
6d80: 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20  ach subterm and 
6d90: 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  composing.** the
6da0: 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f   union of all ro
6db0: 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77  wids using a Row
6dc0: 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
6dd0: 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20  s is similar.** 
6de0: 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63  to "bitmap indic
6df0: 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74  es" in other dat
6e00: 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a  abase engines..*
6e10: 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a  *.** OTHERWISE:.
6e20: 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
6e30: 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65   case 1 nor case
6e40: 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c   2 apply, then l
6e50: 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74  eave the eOperat
6e60: 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72  or set to.** zer
6e70: 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73  o.  This term is
6e80: 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20   not useful for 
6e90: 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  search..*/.stati
6ea0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
6eb0: 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c  zeOrTerm(.  SrcL
6ec0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
6ed0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
6ee0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
6ef0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
6f00: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63          /* the c
6f10: 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c  omplete WHERE cl
6f20: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
6f30: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
6f40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
6f50: 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62  the OR-term to b
6f60: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
6f70: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
6f80: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
6f90: 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48  fo;        /* WH
6fa0: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
6fb0: 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ssing context */
6fc0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6fd0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
6fe0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e;         /* Pa
6ff0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
7000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7010: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
7020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
7030: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7040: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7050: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
7060: 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a  [idxTerm];    /*
7070: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
7080: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78  analyzed */.  Ex
7090: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
70a0: 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20  m->pExpr;       
70b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
70c0: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74  ression of the t
70d0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  erm */.  int i; 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7110: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
7120: 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20  se *pOrWc;      
7130: 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70   /* Breakup of p
7140: 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72  Term into subter
7150: 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ms */.  WhereTer
7160: 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20  m *pOrTerm;     
7170: 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20    /* A Sub-term 
7180: 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63  within the pOrWc
7190: 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66   */.  WhereOrInf
71a0: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20  o *pOrInfo;     
71b0: 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e  /* Additional in
71c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69  formation associ
71d0: 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20  ated with pTerm 
71e0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e  */.  Bitmask chn
71f0: 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f  gToIN;         /
7200: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69  * Tables that mi
7210: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
7220: 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20   1 */.  Bitmask 
7230: 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20  indexable;      
7240: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
7250: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20   are indexable, 
7260: 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20  satisfying case 
7270: 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 */..  /*.  ** 
7280: 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61  Break the OR cla
7290: 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70  use into its sep
72a0: 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20  arate subterms. 
72b0: 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72   The subterms ar
72c0: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
72d0: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
72e0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
72f0: 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57  ing within the W
7300: 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20  hereOrInfo.  ** 
7310: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61  object that is a
7320: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f  ttached to the o
7330: 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73  riginal OR claus
7340: 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61  e term..  */.  a
7350: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
7360: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44  tFlags & (TERM_D
7370: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e  YNAMIC|TERM_ORIN
7380: 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29  FO|TERM_ANDINFO)
7390: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
73a0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
73b0: 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75  OR );.  pTerm->u
73c0: 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e  .pOrInfo = pOrIn
73d0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
73e0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
73f0: 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a  eof(*pOrInfo));.
7400: 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30    if( pOrInfo==0
7410: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65   ) return;.  pTe
7420: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
7430: 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f  ERM_ORINFO;.  pO
7440: 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e  rWc = &pOrInfo->
7450: 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  wc;.  whereClaus
7460: 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49  eInit(pOrWc, pWI
7470: 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  nfo);.  whereSpl
7480: 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c  it(pOrWc, pExpr,
7490: 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41   TK_OR);.  exprA
74a0: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
74b0: 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62  pOrWc);.  if( db
74c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
74d0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
74e0: 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e  t( pOrWc->nTerm>
74f0: 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  =2 );..  /*.  **
7500: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74   Compute the set
7510: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7520: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
7530: 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f  ses 1 or 2..  */
7540: 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e  .  indexable = ~
7550: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68  (Bitmask)0;.  ch
7560: 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61  ngToIN = ~(Bitma
7570: 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f  sk)0;.  for(i=pO
7580: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
7590: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
75a0: 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c  i>=0 && indexabl
75b0: 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  e; i--, pOrTerm+
75c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72  +){.    if( (pOr
75d0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
75e0: 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  & WO_SINGLE)==0 
75f0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e  ){.      WhereAn
7600: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
7610: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
7620: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7630: 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   & (TERM_ANDINFO
7640: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d  |TERM_ORINFO))==
7650: 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54  0 );.      chngT
7660: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  oIN = 0;.      p
7670: 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  AndInfo = sqlite
7680: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7690: 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66   sizeof(*pAndInf
76a0: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
76b0: 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  AndInfo ){.     
76c0: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
76d0: 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20  pAndWC;.        
76e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54  WhereTerm *pAndT
76f0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
7700: 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   j;.        Bitm
7710: 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20  ask b = 0;.     
7720: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41     pOrTerm->u.pA
7730: 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66  ndInfo = pAndInf
7740: 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  o;.        pOrTe
7750: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
7760: 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20  ERM_ANDINFO;.   
7770: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f       pOrTerm->eO
7780: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44  perator = WO_AND
7790: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
77a0: 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63   = &pAndInfo->wc
77b0: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  ;.        whereC
77c0: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
77d0: 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a  , pWC->pWInfo);.
77e0: 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c          whereSpl
77f0: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65  it(pAndWC, pOrTe
7800: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e  rm->pExpr, TK_AN
7810: 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  D);.        expr
7820: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
7830: 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20   pAndWC);.      
7840: 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72    pAndWC->pOuter
7850: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
7860: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61  testcase( db->ma
7870: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7880: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
7890: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
78a0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
78b0: 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57  , pAndTerm=pAndW
78c0: 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e  C->a; j<pAndWC->
78d0: 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64  nTerm; j++, pAnd
78e0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
78f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e       assert( pAn
7900: 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  dTerm->pExpr );.
7910: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7920: 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65  allowedOp(pAndTe
7930: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29  rm->pExpr->op) )
7940: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7950: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
7960: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
7970: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
7980: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
7990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
79a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
79b0: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
79c0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
79d0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
79e0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
79f0: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
7a00: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
7a10: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
7a20: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
7a30: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
7a40: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
7a50: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
7a60: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
7a70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
7a80: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
7a90: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7aa0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
7ab0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
7ac0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
7ad0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
7ae0: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20  ERM_VIRTUAL ){. 
7af0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
7b00: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57   *pOther = &pOrW
7b10: 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50  c->a[pOrTerm->iP
7b20: 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20  arent];.        
7b30: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
7b40: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
7b50: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
7b60: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
7b70: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
7b80: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f  b;.      if( (pO
7b90: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
7ba0: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a   & WO_EQ)==0 ){.
7bb0: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
7bc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
7bd0: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  e{.        chngT
7be0: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  oIN &= b;.      
7bf0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7c00: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68  *.  ** Record th
7c10: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
7c20: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
7c30: 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69  e 2.  The set mi
7c40: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74  ght be.  ** empt
7c50: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66  y..  */.  pOrInf
7c60: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69  o->indexable = i
7c70: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72  ndexable;.  pTer
7c80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69  m->eOperator = i
7c90: 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20  ndexable==0 ? 0 
7ca0: 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20  : WO_OR;..  /*. 
7cb0: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c   ** chngToIN hol
7cc0: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c  ds a set of tabl
7cd0: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20  es that *might* 
7ce0: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20  satisfy case 1. 
7cf0: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76   But.  ** we hav
7d00: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64  e to do some add
7d10: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67  itional checking
7d20: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20   to see if case 
7d30: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73  1 really.  ** is
7d40: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a   satisfied..  **
7d50: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77  .  ** chngToIN w
7d60: 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20  ill hold either 
7d70: 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e  0, 1, or 2 bits.
7d80: 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65    The 0-bit case
7d90: 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
7da0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73   there is no pos
7db0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e  sibility of tran
7dc0: 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20  sforming the OR 
7dd0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20  clause into an. 
7de0: 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   ** IN operator 
7df0: 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d  because one or m
7e00: 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ore terms in the
7e10: 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   OR clause conta
7e20: 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e  in.  ** somethin
7e30: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20  g other than == 
7e40: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  on a column in t
7e50: 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  he single table.
7e60: 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a    The 1-bit.  **
7e70: 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74   case means that
7e80: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
7e90: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20  he OR clause is 
7ea0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a  of the form.  **
7eb0: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65   "table.column=e
7ec0: 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69  xpr" for some si
7ed0: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
7ee0: 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73   one bit that is
7ef0: 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63   set.  ** will c
7f00: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
7f10: 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20   common table.  
7f20: 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  We still need to
7f30: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20   check to make. 
7f40: 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d   ** sure the sam
7f50: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  e column is used
7f60: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20   on all terms.  
7f70: 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69  The 2-bit case i
7f80: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  s when.  ** the 
7f90: 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66  all terms are of
7fa0: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
7fb0: 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e  1.column=table2.
7fc0: 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a  column".  It.  *
7fd0: 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  * might be possi
7fe0: 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49  ble to form an I
7ff0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
8000: 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f  either table1.co
8010: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62  lumn.  ** or tab
8020: 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68  le2.column as th
8030: 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20  e LHS if either 
8040: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
8050: 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20  ry term of.  ** 
8060: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20  the OR clause.. 
8070: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
8080: 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  at terms of the 
8090: 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75  form "table.colu
80a0: 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  mn1=table.column
80b0: 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d  2" (the.  ** sam
80c0: 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20  e table on both 
80d0: 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29  sizes of the ==)
80e0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
80f0: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
8100: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20   chngToIN ){.   
8110: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   int okToChngToI
8120: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  N = 0;     /* Tr
8130: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ue if the conver
8140: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61  sion to IN is va
8150: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  lid */.    int i
8160: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
8170: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69       /* Column i
8180: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49  ndex on lhs of I
8190: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
81a0: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20    int iCursor = 
81b0: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  -1;         /* T
81c0: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d  able cursor comm
81d0: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20  on to all terms 
81e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30  */.    int j = 0
81f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8200: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8210: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   */..    /* Sear
8220: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61  ch for a table a
8230: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  nd column that a
8240: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69  ppears on one si
8250: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  de or the.    **
8260: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d   other of the ==
8270: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65   operator in eve
8280: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61  ry subterm.  Tha
8290: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
82a0: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  mn.    ** will b
82b0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43  e recorded in iC
82c0: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
82d0: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  n.  There might 
82e0: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a  not be any.    *
82f0: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64  * such table and
8300: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b   column.  Set ok
8310: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e  ToChngToIN if an
8320: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62   appropriate tab
8330: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f  le.    ** and co
8340: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75  lumn is found bu
8350: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67  t leave okToChng
8360: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f  ToIN false if no
8370: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a  t found..    */.
8380: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
8390: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49   && !okToChngToI
83a0: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  N; j++){.      p
83b0: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e  OrTerm = pOrWc->
83c0: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  a;.      for(i=p
83d0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  OrWc->nTerm-1; i
83e0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  >=0; i--, pOrTer
83f0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
8400: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
8410: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
8420: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
8430: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
8440: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
8450: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
8460: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
8470: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
8480: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
8490: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64  e 2-bit case and
84a0: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73   we are on the s
84b0: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
84c0: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
84d0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
84e0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
84f0: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73  iteration.  So s
8500: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a  kip this term. *
8510: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
8520: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
8530: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8550: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20    if( (chngToIN 
8560: 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  & getMask(&pWInf
8570: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72  o->sMaskSet, pOr
8580: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8590: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
85a0: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
85b0: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
85c0: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
85d0: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
85e0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
85f0: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
8600: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
8610: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
8620: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
8630: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
8640: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
8650: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
8660: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
8670: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
8680: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
8690: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
86a0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
86b0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
86c0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
86d0: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
86e0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
86f0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8700: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
8710: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8720: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8730: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
8740: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
8750: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
8760: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
8770: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
8780: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
8790: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
87a0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
87b0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
87c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
87d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
87e0: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
87f0: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
8800: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
8810: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
8820: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
8830: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
8840: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
8850: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
8860: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
8870: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
8880: 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29  rOfTwo(chngToIN)
8890: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
88a0: 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65  rt( chngToIN==ge
88b0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
88c0: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72  MaskSet, iCursor
88d0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ) );.        bre
88e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
88f0: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31    testcase( j==1
8900: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65   );..      /* We
8910: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61   have found a ca
8920: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e  ndidate table an
8930: 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b  d column.  Check
8940: 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a   to see if that.
8950: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
8960: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d  nd column is com
8970: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
8980: 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  m in the OR clau
8990: 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f  se */.      okTo
89a0: 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20  ChngToIN = 1;.  
89b0: 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26      for(; i>=0 &
89c0: 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20  & okToChngToIN; 
89d0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
89e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
89f0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8a00: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
8a10: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
8a20: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
8a30: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
8a40: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8a50: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8a60: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
8a70: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
8a80: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  >u.leftColumn!=i
8a90: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
8aa0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
8ab0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
8ac0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
8ad0: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
8ae0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
8af0: 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  /* If the right-
8b00: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
8b10: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
8b20: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
8b30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
8b40: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
8b50: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
8b60: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
8b70: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ype.          **
8b80: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
8b90: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65   required on the
8ba0: 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74   right.  (Ticket
8bb0: 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20   #2249).        
8bc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
8bd0: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
8be0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
8bf0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
8c00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
8c10: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
8c20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8c30: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
8c40: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
8c50: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30   if( affRight!=0
8c60: 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66   && affRight!=af
8c70: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  fLeft ){.       
8c80: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
8c90: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  N = 0;.         
8ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8cb0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
8cc0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
8cd0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
8ce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8cf0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8d00: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
8d10: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74  kToChngToIN is t
8d20: 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20  rue if original 
8d30: 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a  pTerm satisfies.
8d40: 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20      ** case 1.  
8d50: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f  In that case, co
8d60: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69  nstruct a new vi
8d70: 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20  rtual term that 
8d80: 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d  is .    ** pTerm
8d90: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
8da0: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  an IN operator..
8db0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
8dc0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  kToChngToIN ){. 
8dd0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8df0: 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69   transient dupli
8e00: 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  cate expression 
8e10: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
8e20: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20  t *pList = 0;   
8e30: 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68  /* The RHS of th
8e40: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
8e50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
8e60: 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ft = 0;       /*
8e70: 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
8e80: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
8e90: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8eb0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f  he complete IN o
8ec0: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
8ed0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
8ee0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
8ef0: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20  pOrWc->a; i>=0; 
8f00: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
8f10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
8f20: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8f30: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20   TERM_OR_OK)==0 
8f40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8f50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8f60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8f70: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
8f80: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8f90: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
8fa0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
8fb0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8fc0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
8fd0: 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =iColumn );.    
8fe0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
8ff0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
9000: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
9010: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
9020: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
9030: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
9040: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
9050: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
9060: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
9070: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
9080: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
9090: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
90a0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
90b0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
90c0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
90d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
90e0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
90f0: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
9100: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
9110: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
9120: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
9130: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
9140: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
9150: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
9160: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9170: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
9180: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
9190: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
91a0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
91b0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
91c0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
91d0: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
91e0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
91f0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
9200: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
9210: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
9220: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
9230: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
9240: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
9250: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
9260: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
9270: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
9280: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
9290: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
92a0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
92b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
92c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
92d0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
92e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
92f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9300: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
9310: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
9320: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
9330: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
9340: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
9350: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
9360: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9370: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69   */../*.** The i
9380: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
9390: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
93a0: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
93b0: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
93c0: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
93d0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
93e0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
93f0: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
9400: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
9410: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
9420: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
9430: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
9440: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
9450: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
9460: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9470: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
9480: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
9490: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
94a0: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
94b0: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
94c0: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
94d0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
94e0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
94f0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
9500: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
9510: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
9520: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
9530: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
9540: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
9550: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
9560: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
9570: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
9580: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
9590: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
95a0: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
95b0: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
95c0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
95d0: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
95e0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
95f0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
9600: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
9610: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
9620: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
9630: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
9640: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
9650: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
9660: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
9670: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
9680: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
9690: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
96a0: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
96b0: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
96c0: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
96d0: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
96e0: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
96f0: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
9700: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
9710: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
9720: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
9730: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
9740: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
9750: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
9760: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
9770: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
9780: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
9790: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
97a0: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
97b0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
97c0: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
97d0: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
97e0: 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  fo; /* WHERE cla
97f0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
9800: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
9810: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9830: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
9840: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65  nalyzed */.  Whe
9850: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
9860: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
9870: 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e   Set of table in
9880: 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45  dex masks */.  E
9890: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
98c0: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
98d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
98e0: 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20  ereqLeft;       
98f0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
9900: 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70  uesites of the p
9910: 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20  Expr->pLeft */. 
9920: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
9930: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
9940: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
9950: 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  es of pExpr */. 
9960: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69   Bitmask extraRi
9970: 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ght = 0;        
9980: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e    /* Extra depen
9990: 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20  dencies on LEFT 
99a0: 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  JOIN */.  Expr *
99b0: 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20  pStr1 = 0;      
99c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
99d0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
99e0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
99f0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a10: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
9a20: 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64  B ends with wild
9a30: 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  card */.  int no
9a40: 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Case = 0;       
9a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
9a60: 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75  KE/GLOB distingu
9a70: 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20  ishes case */.  
9a80: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70   /* Top-level op
9ab0: 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e  erator.  pExpr->
9ac0: 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  op */.  Parse *p
9ad0: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
9ae0: 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73  pParse;  /* Pars
9af0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9b00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9b10: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
9b20: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
9b30: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
9b40: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
9b50: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
9b60: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
9b70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
9b80: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
9b90: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
9ba0: 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65  t;.  pExpr = pTe
9bb0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73  rm->pExpr;.  ass
9bc0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
9bd0: 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e  TK_AS && pExpr->
9be0: 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op!=TK_COLLATE )
9bf0: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
9c00: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
9c10: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9c20: 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20  >pLeft);.  op = 
9c30: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
9c40: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
9c50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
9c60: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
9c70: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9c80: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9c90: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
9ca0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9cb0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c  qRight = exprSel
9cc0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
9cd0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
9ce0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
9cf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72  else{.      pTer
9d00: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
9d10: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
9d20: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9d30: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
9d40: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
9d50: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
9d60: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
9d70: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
9d80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
9d90: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
9da0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
9db0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9dc0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
9dd0: 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54  rereqAll = exprT
9de0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9df0: 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  et, pExpr);.  if
9e00: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9e10: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
9e20: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74  Join) ){.    Bit
9e30: 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b  mask x = getMask
9e40: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9e50: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
9e60: 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c  e);.    prereqAl
9e70: 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72  l |= x;.    extr
9e80: 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f  aRight = x-1;  /
9e90: 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  * ON clause term
9ea0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  s may not be use
9eb0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a  d with an index.
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66         ** on lef
9ee0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
9ef0: 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20  T JOIN.  Ticket 
9f00: 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70  #3015 */.  }.  p
9f10: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
9f20: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70  = prereqAll;.  p
9f30: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9f40: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
9f50: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
9f60: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
9f70: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
9f80: 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20  wedOp(op) ){.   
9f90: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
9fa0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
9fb0: 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  llate(pExpr->pLe
9fc0: 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ft);.    Expr *p
9fd0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
9fe0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
9ff0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a000: 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20     u16 opMask = 
a010: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
a020: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
a030: 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20  )==0 ? WO_ALL : 
a040: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66  WO_EQUIV;.    if
a050: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
a060: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a070: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
a080: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
a090: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
a0a0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
a0b0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
a0c0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
a0d0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
a0e0: 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73  Mask(op) & opMas
a0f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
a100: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
a110: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
a120: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
a130: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
a140: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
a150: 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20     u16 eExtraOp 
a160: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
a170: 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e  xtra bits for pN
a180: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  ew->eOperator */
a190: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
a1a0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
a1b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
a1c0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70  dxNew;.        p
a1d0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
a1e0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
a1f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a200: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
a220: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a230: 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  db, pDup);.     
a240: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
a250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a260: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
a270: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
a280: 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  Dup, TERM_VIRTUA
a290: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
a2a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
a2b0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
a2c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
a2d0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
a2e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
a2f0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
a300: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
a310: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
a320: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
a330: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
a340: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
a350: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
a360: 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  PIED;.        if
a370: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a380: 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  EQ.         && !
a390: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a3a0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
a3b0: 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  in).         && 
a3c0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
a3d0: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  led(db, SQLITE_T
a3e0: 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20  ransitive).     
a3f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
a400: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a410: 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20   |= WO_EQUIV;.  
a420: 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70          eExtraOp
a430: 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20   = WO_EQUIV;.   
a440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a450: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
a460: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
a470: 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a    pNew = pTerm;.
a480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
a490: 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65  prCommute(pParse
a4a0: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  , pDup);.      p
a4b0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
a4c0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
a4d0: 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  up->pLeft);.    
a4e0: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
a4f0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
a500: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
a510: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
a520: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
a530: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
a540: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a550: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72  raRight) != prer
a560: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  eqLeft );.      
a570: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
a580: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c  t = prereqLeft |
a590: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20   extraRight;.   
a5a0: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
a5b0: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
a5c0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
a5d0: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f  rator = (operato
a5e0: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20  rMask(pDup->op) 
a5f0: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70  + eExtraOp) & op
a600: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mask;.    }.  }.
a610: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a620: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
a630: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
a640: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
a650: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
a660: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
a670: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
a680: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
a690: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
a6a0: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
a6b0: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
a6c0: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
a6d0: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
a6e0: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
a6f0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
a700: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
a710: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
a720: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
a730: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
a740: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
a750: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
a760: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
a770: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
a780: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
a790: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
a7a0: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
a7b0: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
a7c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
a7d0: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
a7e0: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
a7f0: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
a800: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
a810: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
a820: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
a830: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
a840: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
a850: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
a860: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
a870: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
a880: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
a890: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
a8a0: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
a8b0: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
a8c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
a8d0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a8e0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
a8f0: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
a900: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
a910: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
a920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
a930: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
a940: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
a950: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
a960: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
a970: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
a980: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
a990: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
a9a0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
a9b0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
a9c0: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a9f0: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
aa00: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
aa30: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
aa40: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20  a[i].pExpr, 0), 
aa50: 30 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66  0);.      transf
aa60: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
aa70: 4e 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b  NewExpr, pExpr);
aa80: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
aa90: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
aaa0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
aab0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
aac0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
aad0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
aae0: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
aaf0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
ab00: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
ab10: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
ab20: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
ab30: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
ab40: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
ab50: 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  dxTerm;.    }.  
ab60: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
ab70: 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  = 2;.  }.#endif 
ab80: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
ab90: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
aba0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  ION */..#if !def
abb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
abc0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
abd0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
abe0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
abf0: 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  RY).  /* Analyze
ac00: 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20   a term that is 
ac10: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20  composed of two 
ac20: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
ac30: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
ac40: 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  ** an OR operato
ac50: 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  r..  */.  else i
ac60: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
ac70: 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OR ){.    asser
ac80: 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  t( pWC->op==TK_A
ac90: 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  ND );.    exprAn
aca0: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63  alyzeOrTerm(pSrc
acb0: 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b  , pWC, idxTerm);
acc0: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
acd0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
ace0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
acf0: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
ad00: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
ad10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ad20: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
ad30: 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73  ON.  /* Add cons
ad40: 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63  traints to reduc
ad50: 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
ad60: 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20  ce on a LIKE or 
ad70: 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74  GLOB.  ** operat
ad80: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  or..  **.  ** A 
ad90: 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20  like pattern of 
ada0: 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45  the form "x LIKE
adb0: 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e   'abc%'" is chan
adc0: 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61  ged into constra
add0: 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ints.  **.  **  
ade0: 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27          x>='abc'
adf0: 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44   AND x<'abd' AND
ae00: 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20   x LIKE 'abc%'. 
ae10: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73   **.  ** The las
ae20: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
ae30: 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20  he prefix "abc" 
ae40: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74  is incremented t
ae50: 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20  o form the.  ** 
ae60: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
ae70: 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a  ition "abd"..  *
ae80: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d  /.  if( pWC->op=
ae90: 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69  =TK_AND .   && i
aea0: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72  sLikeOrGlob(pPar
aeb0: 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72  se, pExpr, &pStr
aec0: 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20  1, &isComplete, 
aed0: 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20  &noCase).  ){.  
aee0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
aef0: 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c       /* LHS of L
af00: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
af10: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
af20: 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43  Str2;       /* C
af30: 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52  opy of pStr1 - R
af40: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
af50: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
af60: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b  Expr *pNewExpr1;
af70: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
af80: 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64  xpr2;.    int id
af90: 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69  xNew1;.    int i
afa0: 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65  dxNew2;.    Toke
afb0: 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20  n sCollSeqName; 
afc0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
afd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
afe0: 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  /..    pLeft = p
aff0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
b000: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
b010: 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  Str2 = sqlite3Ex
b020: 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c  prDup(db, pStr1,
b030: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62   0);.    if( !db
b040: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b050: 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70  {.      u8 c, *p
b060: 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74  C;       /* Last
b070: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
b080: 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64  e the first wild
b090: 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43  card */.      pC
b0a0: 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e   = (u8*)&pStr2->
b0b0: 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33  u.zToken[sqlite3
b0c0: 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e  Strlen30(pStr2->
b0d0: 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20  u.zToken)-1];.  
b0e0: 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20      c = *pC;.   
b0f0: 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b     if( noCase ){
b100: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
b110: 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72  point is to incr
b120: 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63  ement the last c
b130: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
b140: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
b150: 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20    ** wildcard.  
b160: 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d  But if we increm
b170: 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69  ent '@', that wi
b180: 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20  ll push it into 
b190: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
b1a0: 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20  lphabetic range 
b1b0: 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65  where case conve
b1c0: 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73  rsions will mess
b1d0: 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20   up the .       
b1e0: 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   ** inequality. 
b1f0: 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20   To avoid this, 
b200: 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73  make sure to als
b210: 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20  o run the full. 
b220: 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f         ** LIKE o
b230: 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20  n all candidate 
b240: 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63  expressions by c
b250: 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f  learing the isCo
b260: 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20  mplete flag.    
b270: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
b280: 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73  f( c=='A'-1 ) is
b290: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20  Complete = 0;.  
b2a0: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
b2b0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
b2c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2d0: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
b2e0: 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e   }.    sCollSeqN
b2f0: 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f  ame.z = noCase ?
b300: 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e   "NOCASE" : "BIN
b310: 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53  ARY";.    sCollS
b320: 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20  eqName.n = 6;.  
b330: 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
b340: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b350: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
b360: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
b370: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b380: 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20   TK_GE, .       
b390: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
b3a0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
b3b0: 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c  Parse,pNewExpr1,
b3c0: 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
b3d0: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
b3e0: 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66  , 0);.    transf
b3f0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
b400: 4e 65 77 45 78 70 72 31 2c 20 70 45 78 70 72 29  NewExpr1, pExpr)
b410: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
b420: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b430: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
b440: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b450: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b460: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b470: 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew1==0 );.    ex
b480: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
b490: 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20  pWC, idxNew1);. 
b4a0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
b4b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b4c0: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
b4d0: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
b4e0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b4f0: 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20  , TK_LT,.       
b500: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
b510: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
b520: 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c  Parse,pNewExpr2,
b530: 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
b540: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32             pStr2
b550: 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66  , 0);.    transf
b560: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
b570: 4e 65 77 45 78 70 72 32 2c 20 70 45 78 70 72 29  NewExpr2, pExpr)
b580: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
b590: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b5a0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
b5b0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b5c0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b5d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b5e0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
b5f0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
b600: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
b610: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
b620: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
b630: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
b640: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
b650: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
b660: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
b670: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
b680: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
b690: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
b6a0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
b6b0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
b6c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
b6d0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
b6e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b6f0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b700: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
b710: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
b720: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
b730: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
b740: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
b750: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
b760: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
b770: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
b780: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
b790: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
b7a0: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
b7b0: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
b7c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
b7d0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
b7e0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
b7f0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
b800: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
b810: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
b820: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
b830: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
b840: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
b850: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b860: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
b870: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
b880: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
b890: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
b8a0: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
b8b0: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
b8c0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
b8d0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
b8e0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
b8f0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b900: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
b910: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
b920: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
b930: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
b940: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
b950: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b960: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
b970: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
b980: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
b990: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
b9a0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
b9b0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
b9c0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b9d0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
ba00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ba10: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
ba20: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
ba30: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
ba40: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
ba50: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
ba60: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
ba70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ba80: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
ba90: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
baa0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
bab0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
bac0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
bad0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
bae0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
baf0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
bb00: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
bb10: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
bb20: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
bb30: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
bb40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
bb50: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
bb60: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
bb70: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
bb80: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
bb90: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
bba0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bbb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
bbc0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
bbd0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
bbe0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bbf0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
bc00: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
bc10: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bc20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
bc30: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
bc40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
bc50: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
bc60: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
bc70: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
bc80: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
bc90: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
bca0: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
bcb0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
bcc0: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
bcd0: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
bce0: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
bcf0: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
bd00: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
bd10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
bd20: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
bd30: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
bd40: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
bd50: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
bd60: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
bd70: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
bd80: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
bd90: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
bda0: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
bdb0: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
bdc0: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
bdd0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
bde0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
bdf0: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
be00: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
be10: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
be20: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
be30: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
be40: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
be50: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
be60: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
be70: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
be80: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
be90: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
bea0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
beb0: 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
bec0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
bed0: 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
bee0: 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
bef0: 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29  QLITE_Stat3).  )
bf00: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
bf10: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
bf20: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
bf30: 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
bf40: 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
bf50: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
bf60: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
bf70: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bf80: 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, TK_GT,.     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
bfb0: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
bfc0: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
bff0: 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
c000: 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
c010: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c020: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c030: 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , pNewExpr,.    
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56            TERM_V
c060: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
c070: 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
c080: 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
c090: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
c0a0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
c0b0: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
c0c0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
c0d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
c0e0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c0f0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
c100: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c110: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
c120: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
c130: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c140: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
c150: 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  GT;.      pNewTe
c160: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
c170: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
c180: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c190: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
c1a0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
c1b0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
c1c0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
c1d0: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
c1e0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
c1f0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
c200: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
c210: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
c220: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
c230: 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65  AT4 */..  /* Pre
c240: 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74  vent ON clause t
c250: 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a  erms of a LEFT J
c260: 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75  OIN from being u
c270: 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a  sed to drive.  *
c280: 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74  * an index for t
c290: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
c2a0: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  t of the join.. 
c2b0: 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65   */.  pTerm->pre
c2c0: 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72  reqRight |= extr
c2d0: 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aRight;.}../*.**
c2e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
c2f0: 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f  earches pList fo
c300: 72 20 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d  r a entry that m
c310: 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d  atches the iCol-
c320: 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  th column.** of 
c330: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
c340: 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70  * If such an exp
c350: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
c360: 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70  , its index in p
c370: 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74  List->a[] is ret
c380: 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20  urned. If.** no 
c390: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
c3a0: 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  und, -1 is retur
c3b0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
c3c0: 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28  nt findIndexCol(
c3d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c3f0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
c400: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
c410: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
c420: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
c430: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73  ession list to s
c440: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
c450: 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  Base,           
c460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
c470: 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61  rsor for table a
c480: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
c490: 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
c4a0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
c4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
c4c0: 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d  x to match colum
c4d0: 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43  n of */.  int iC
c4e0: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
c4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
c500: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20  umn of index to 
c510: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
c520: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
c530: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
c540: 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a  >azColl[iCol];..
c550: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
c560: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c570: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
c580: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
c590: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
c5a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
c5b0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
c5c0: 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  MN.     && p->iC
c5d0: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
c5e0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20  olumn[iCol].    
c5f0: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
c600: 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Base.    ){.    
c610: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
c620: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
c630: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
c640: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
c650: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
c660: 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d  YS(pColl) && 0==
c670: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
c680: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  Coll->zName, zCo
c690: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ll) ){.        r
c6a0: 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d  eturn i;.      }
c6b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
c6c0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
c6d0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
c6e0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
c6f0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61  pression-list pa
c700: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
c710: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
c720: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a   redundant..**.*
c730: 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73  * A DISTINCT lis
c740: 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69  t is redundant i
c750: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
c760: 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62  ontains some sub
c770: 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  set of.** column
c780: 73 20 74 68 61 74 20 61 72 65 20 75 6e 69 71 75  s that are uniqu
c790: 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a  e and non-null..
c7a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
c7b0: 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
c7c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c7d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
c7e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c7f0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
c800: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
c810: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
c820: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
c830: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
c840: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
c850: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
c860: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20  List *pDistinct 
c870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
c880: 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65  ult set that nee
c890: 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43  ds to be DISTINC
c8a0: 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  T */.){.  Table 
c8b0: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
c8c0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
c8f0: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
c900: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
c910: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
c920: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
c930: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
c940: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
c950: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
c960: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
c970: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
c980: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
c990: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
c9a0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
c9b0: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
c9c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
c9d0: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
c9e0: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
c9f0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
ca00: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
ca10: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
ca20: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
ca30: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
ca40: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
ca50: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
ca60: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
ca70: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
ca80: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
ca90: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
caa0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
cab0: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
cac0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
cad0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
cae0: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
caf0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
cb00: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
cb10: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
cb20: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
cb30: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
cb40: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
cb50: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
cb60: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
cb70: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
cb80: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
cb90: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
cba0: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
cbb0: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
cbc0: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
cbd0: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
cbe0: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
cbf0: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
cc00: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
cc10: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
cc20: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
cc30: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
cc40: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
cc50: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
cc60: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
cc70: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
cc80: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
cc90: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
cca0: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
ccb0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
ccc0: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
ccd0: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
cce0: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
ccf0: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
cd00: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
cd10: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
cd20: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
cd30: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
cd40: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
cd50: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
cd60: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
cd70: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
cd80: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
cd90: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
cda0: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
cdb0: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
cdc0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
cdd0: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
cde0: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
cdf0: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
ce00: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
ce10: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
ce20: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
ce30: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
ce40: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
ce50: 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e  r==OE_None ) con
ce60: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
ce70: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
ce80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ce90: 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78   i16 iCol = pIdx
cea0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
ceb0: 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64       if( 0==find
cec0: 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
ced0: 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b   iCol, ~(Bitmask
cee0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
cef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
cf00: 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e  iIdxCol = findIn
cf10: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
cf20: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
cf30: 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20   pIdx, i);.     
cf40: 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30     if( iIdxCol<0
cf50: 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   || pTab->aCol[i
cf60: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  Col].notNull==0 
cf70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
cf80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
cf90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
cfa0: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( i==pIdx->nKe
cfb0: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  yCol ){.      /*
cfc0: 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
cfd0: 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
cfe0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
cff0: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
d000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
d010: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
d020: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
d030: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
d040: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
d050: 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62  input value to b
d060: 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  ase 2..*/.static
d070: 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c   LogEst estLog(L
d080: 6f 67 45 73 74 20 4e 29 7b 0a 20 20 4c 6f 67 45  ogEst N){.  LogE
d090: 73 74 20 78 20 3d 20 73 71 6c 69 74 65 33 4c 6f  st x = sqlite3Lo
d0a0: 67 45 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72  gEst(N);.  retur
d0b0: 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20  n x>33 ? x - 33 
d0c0: 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  : 0;.}../*.** Tw
d0d0: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
d0e0: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
d0f0: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
d100: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
d110: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
d120: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
d130: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
d140: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
d150: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
d160: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
d170: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
d180: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
d190: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
d1a0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d1b0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d1c0: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
d1d0: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
d1e0: 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
d1f0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
d200: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
d210: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
d220: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
d230: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
d240: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
d250: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
d260: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
d270: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d280: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
d290: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
d2a0: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
d2b0: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
d2c0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
d2d0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
d2e0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
d2f0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
d300: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
d310: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d320: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
d330: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
d340: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
d350: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
d360: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
d370: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d380: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
d390: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
d3a0: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
d3b0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
d3c0: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
d3d0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
d3e0: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
d3f0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
d400: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
d410: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
d420: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
d430: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
d440: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
d450: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
d460: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
d470: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
d480: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d490: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
d4a0: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
d4b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d4c0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d4d0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
d4e0: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
d4f0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
d500: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
d510: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d520: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
d530: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
d540: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d550: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
d560: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
d570: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
d580: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
d590: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
d5a0: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
d5b0: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
d5c0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d5d0: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
d5e0: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
d5f0: 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74  edCost);.  sqlit
d600: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d610: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25   estimatedRows=%
d620: 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  lld\n", p->estim
d630: 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c  atedRows);.}.#el
d640: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
d650: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
d660: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
d670: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
d680: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
d690: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
d6a0: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
d6b0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
d6c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
d6d0: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
d6e0: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
d6f0: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
d700: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
d710: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
d720: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
d730: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
d740: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
d750: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
d760: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
d770: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
d780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
d790: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
d7a0: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
d7b0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
d7c0: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
d7d0: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
d7e0: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
d7f0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
d800: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
d810: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
d820: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
d830: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
d840: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
d850: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
d860: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
d870: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
d880: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
d890: 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29  or & WO_EQ)==0 )
d8a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
d8b0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
d8c0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
d8d0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
d8e0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
d8f0: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
d900: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
d910: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
d920: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
d930: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
d940: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
d950: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
d960: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
d970: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
d980: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
d990: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
d9a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
d9b0: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65  C_INDEX./*.** Ge
d9c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
d9d0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
d9e0: 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e  ex object for an
d9f0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
da00: 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75  .** and to set u
da10: 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c  p the WhereLevel
da20: 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73   object pLevel s
da30: 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  o that the code 
da40: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b  generator.** mak
da50: 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75  es use of the au
da60: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a  tomatic index..*
da70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
da80: 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
da90: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
daa0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
dab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
dac0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
dad0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
dae0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
daf0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
db00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
db10: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
db20: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
db30: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74  ause term to get
db40: 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20   the next index 
db50: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
db60: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
db70: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
db80: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
db90: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
dba0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
dbb0: 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  el          /* W
dbc0: 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68  rite new index h
dbd0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
dbe0: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
dbf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
dc00: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
dc10: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20  the constructed 
dc20: 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
dc30: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
dc40: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
dc50: 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
dc60: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
dc70: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
dc80: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
dc90: 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
dca0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
dcb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dcc0: 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
dcd0: 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
dce0: 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
dcf0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
dd00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
dd10: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
dd20: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
dd30: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
dd40: 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
dd50: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
dd60: 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
dd70: 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
dd80: 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
dd90: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
dda0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
ddb0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
ddc0: 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dde0: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
ddf0: 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
de00: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de20: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
de30: 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
de40: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
de70: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
dea0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
deb0: 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
dec0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
ded0: 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
dee0: 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
def0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
df00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
df10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
df20: 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
df30: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
df40: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
df50: 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
df60: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
df70: 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  NotUsed;        
df80: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
df90: 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ace on the end o
dfa0: 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d  f pIdx */.  Bitm
dfb0: 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
dfc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
dfd0: 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
dfe0: 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
dff0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
e000: 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
e010: 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
e020: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e030: 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e  */.  u8 sentWarn
e040: 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ing = 0;        
e050: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61   /* True if a wa
e060: 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20  rnning has been 
e070: 69 73 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  issued */..  /* 
e080: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e090: 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
e0a0: 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
e0b0: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
e0c0: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
e0d0: 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
e0e0: 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
e0f0: 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
e100: 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
e110: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
e120: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
e130: 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
e140: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
e150: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
e160: 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  e(v);..  /* Coun
e170: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
e180: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
e190: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
e1a0: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
e1b0: 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
e1c0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
e1d0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65  traints */.  nKe
e1e0: 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  yCol = 0;.  pTab
e1f0: 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
e200: 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
e210: 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
e220: 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
e230: 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78  l->pWLoop;.  idx
e240: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
e250: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
e260: 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
e270: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
e280: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
e290: 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
e2a0: 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
e2b0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
e2c0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
e2d0: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
e2e0: 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
e2f0: 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
e300: 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
e310: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e320: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
e330: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e340: 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
e350: 20 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72      if( !sentWar
e360: 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ning ){.        
e370: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
e380: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
e390: 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20  NDEX,.          
e3a0: 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64    "automatic ind
e3b0: 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70  ex on %s(%s)", p
e3c0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Table->zName,.  
e3d0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65            pTable
e3e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
e3f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e  me);.        sen
e400: 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20  tWarning = 1;.  
e410: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e420: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
e430: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e440: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
e450: 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ize(pParse->db, 
e460: 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31  pLoop, nKeyCol+1
e470: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
e480: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
e490: 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70  m[nKeyCol++] = p
e4a0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
e4b0: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
e4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e4d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  }.  assert( nKey
e4e0: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  Col>0 );.  pLoop
e4f0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
e500: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
e510: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70  nKeyCol;.  pLoop
e520: 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
e530: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
e540: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
e550: 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
e580: 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
e590: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
e5a0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
e5b0: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
e5c0: 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
e5d0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
e5e0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
e5f0: 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
e600: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
e610: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
e620: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
e630: 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
e640: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
e650: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
e660: 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
e670: 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
e680: 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
e690: 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
e6a0: 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
e6b0: 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
e6c0: 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
e6d0: 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
e6e0: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
e6f0: 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
e700: 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
e710: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
e720: 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
e730: 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
e740: 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
e750: 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
e760: 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
e770: 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
e780: 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
e790: 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f  l = (pTable->nCo
e7a0: 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d  l >= BMS-1) ? BM
e7b0: 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43  S-1 : pTable->nC
e7c0: 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ol;.  testcase( 
e7d0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
e7e0: 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  S-1 );.  testcas
e7f0: 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
e800: 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28  =BMS-2 );.  for(
e810: 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
e820: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
e830: 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
e840: 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b  IT(i) ) nKeyCol+
e850: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
e860: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
e870: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
e880: 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54     nKeyCol += pT
e890: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53  able->nCol - BMS
e8a0: 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f   + 1;.  }.  pLoo
e8b0: 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
e8c0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
e8d0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
e8e0: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
e8f0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
e900: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
e910: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
e920: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
e930: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
e940: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
e950: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
e960: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
e970: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
e980: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
e990: 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70  ndex = pIdx;.  p
e9a0: 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75  Idx->zName = "au
e9b0: 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64  to-index";.  pId
e9c0: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
e9d0: 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  le;.  n = 0;.  i
e9e0: 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
e9f0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
ea00: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
ea10: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
ea20: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
ea30: 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
ea40: 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
ea50: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
ea60: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
ea70: 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
ea80: 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
ea90: 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
eaa0: 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
eab0: 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
eac0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
ead0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
eae0: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
eaf0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
eb00: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
eb10: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
eb20: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
eb30: 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  r;.        idxCo
eb40: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
eb50: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
eb60: 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e  umn[n] = pTerm->
eb70: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
eb80: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
eb90: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
eba0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
ebb0: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
ebc0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
ebd0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
ebe0: 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  ] = ALWAYS(pColl
ebf0: 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  ) ? pColl->zName
ec00: 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   : "BINARY";.   
ec10: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
ec20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
ec30: 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c  sert( (u32)n==pL
ec40: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
ec50: 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64   );..  /* Add ad
ec60: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
ec70: 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
ec80: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
ec90: 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  dex into.  ** a 
eca0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
ecb0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  /.  for(i=0; i<m
ecc0: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
ecd0: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
ece0: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b   & MASKBIT(i) ){
ecf0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
ed00: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
ed10: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ed20: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
ed30: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
ed40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
ed50: 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
ed60: 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20  IT(BMS-1) ){.   
ed70: 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c   for(i=BMS-1; i<
ed80: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
ed90: 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  +){.      pIdx->
eda0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
edb0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
edc0: 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
edd0: 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
ede0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
edf0: 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a  ( n==nKeyCol );.
ee00: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
ee10: 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78  [n] = -1;.  pIdx
ee20: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
ee30: 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72  INARY";..  /* Cr
ee40: 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74  eate the automat
ee50: 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73  ic index */.  as
ee60: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
ee70: 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c  dxCur>=0 );.  pL
ee80: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
ee90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
eea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eeb0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op2(v, OP_OpenAu
eec0: 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
eed0: 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f  >iIdxCur, nKeyCo
eee0: 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  l+1);.  sqlite3V
eef0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
ef00: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
ef10: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
ef20: 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
ef30: 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
ef40: 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
ef50: 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
ef60: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64  content */.  add
ef70: 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
ef80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
ef90: 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
efa0: 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76  TabCur); VdbeCov
efb0: 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
efc0: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
efd0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
efe0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
eff0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
f000: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
f010: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
f020: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
f030: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
f040: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
f050: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
f060: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
f070: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
f080: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
f090: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
f0a0: 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ULT);.  sqlite3V
f0b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f0c0: 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
f0d0: 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
f0e0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
f0f0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
f100: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
f110: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
f120: 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
f130: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f140: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
f150: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f160: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
f170: 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
f180: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
f190: 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
f1a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
f1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f1c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
f1d0: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
f1e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f1f0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
f200: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f210: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
f220: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f230: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
f240: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f250: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
f260: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
f270: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
f280: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
f290: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
f2a0: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
f2b0: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
f2c0: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
f2d0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
f2e0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
f2f0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
f300: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f310: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
f320: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
f330: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
f340: 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
f350: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
f360: 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
f370: 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
f380: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
f390: 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
f3a0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
f3b0: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
f3c0: 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
f3d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
f3e0: 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
f3f0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f400: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f410: 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
f420: 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
f430: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
f440: 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
f450: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
f460: 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75  xInfo;..  /* Cou
f470: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
f480: 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
f490: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
f4a0: 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
f4b0: 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
f4c0: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
f4d0: 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
f4e0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
f4f0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
f500: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
f510: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f520: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
f530: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
f540: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
f550: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
f560: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
f570: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
f580: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
f590: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
f5a0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f5b0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f5c0: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
f5d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
f5e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
f5f0: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
f600: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
f610: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
f620: 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30  LL|WO_EQUIV))==0
f630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
f640: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
f650: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
f660: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
f670: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
f680: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
f690: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
f6a0: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
f6b0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
f6c0: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
f6d0: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
f6e0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
f6f0: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
f700: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
f710: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f720: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
f730: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
f740: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
f750: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
f760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
f770: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
f780: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
f790: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
f7a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
f7b0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
f7c0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
f7d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
f7e0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
f7f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f800: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
f810: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
f820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
f830: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
f840: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f850: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
f860: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
f870: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
f880: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
f890: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
f8c0: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
f8d0: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
f8e0: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
f910: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
f920: 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
f930: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
f940: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f950: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
f960: 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
f970: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
f980: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
f990: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
f9a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f9b0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
f9c0: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
f9d0: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
f9e0: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
f9f0: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
fa00: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
fa10: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
fa20: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
fa30: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
fa40: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
fa50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
fa60: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
fa70: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
fa80: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
fa90: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
faa0: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
fab0: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
fac0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
fad0: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
fae0: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
faf0: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
fb00: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fb10: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
fb20: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
fb30: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
fb40: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
fb50: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
fb60: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
fb70: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
fb80: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
fb90: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
fba0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
fbb0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
fbc0: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
fbd0: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
fbe0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
fbf0: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
fc00: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
fc10: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
fc20: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
fc30: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
fc40: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
fc50: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
fc60: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
fcb0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
fcc0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
fcd0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
fce0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
fcf0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
fd00: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
fd10: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
fd20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
fd30: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
fd40: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
fd50: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
fd60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fd70: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
fd80: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
fd90: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
fda0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
fdb0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
fdc0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
fdd0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
fde0: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
fdf0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fe00: 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
fe10: 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
fe20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
fe30: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
fe40: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
fe50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
fe60: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
fe70: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
fe80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
fe90: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
fea0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
feb0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
fec0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
fed0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
fee0: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
fef0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
ff00: 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
ff10: 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
ff20: 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
ff30: 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
ff40: 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
ff50: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
ff60: 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
ff70: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
ff80: 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
ff90: 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
ffa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
ffb0: 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
ffc0: 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
ffd0: 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
ffe0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
fff0: 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
10000 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
10010 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
10020 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
10030 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
10040 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
10050 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
10060 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
10070 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
10080 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
10090 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
100a0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
100b0 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
100c0 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
100d0 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
100e0 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
100f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10100 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10110 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
10120 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
10130 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
10140 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
10150 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
10160 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
10170 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
10180 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
10190 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
101a0 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
101b0 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
101c0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
101d0 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
101e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
101f0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
10200 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
10210 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
10220 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
10230 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
10240 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10250 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
10260 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
10270 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
10280 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
10290 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
102a0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
102b0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
102c0 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
102d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
102e0 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
102f0 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
10300 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
10310 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
10320 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
10330 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10340 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
10350 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
10360 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
10370 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
10380 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
10390 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
103a0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
103b0 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
103c0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
103d0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
103e0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
103f0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
10400 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
10410 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
10420 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
10430 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
10440 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
10450 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
10460 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
10470 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
10480 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
10490 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
104a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
104b0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
104c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
104d0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
104e0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
104f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
10500 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
10510 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
10520 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
10530 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
10540 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
10550 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
10560 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
10570 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
10580 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
10590 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
105a0 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
105b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
105c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
105d0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
105e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
105f0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
10600 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
10610 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
10620 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10630 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
10640 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
10650 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
10660 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10670 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10680 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
10690 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
106a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
106b0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
106c0 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
106d0 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
106e0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
106f0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
10700 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
10710 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
10720 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
10730 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
10740 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
10750 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10760 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
10770 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
10780 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
10790 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
107a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
107b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
107c0 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
107d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
107e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
107f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
10800 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  /...#ifdef SQLIT
10810 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
10820 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
10830 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74  timate the locat
10840 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75  ion of a particu
10850 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c  lar key among al
10860 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20  l keys in an.** 
10870 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68  index.  Store th
10880 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74  e results in aSt
10890 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  at as follows:.*
108a0 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d  *.**    aStat[0]
108b0 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
108c0 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74  r of rows less t
108d0 68 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61  han pVal.**    a
108e0 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74  Stat[1]      Est
108f0 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
10900 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a   equal to pVal.*
10910 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10920 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10940 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a   whereKeyStats(.
10950 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10970 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
10980 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
10990 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
109a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
109b0 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69  o consider domai
109c0 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  n of */.  Unpack
109d0 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20  edRecord *pRec, 
109e0 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
109f0 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e  of values to con
10a00 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  sider */.  int r
10a10 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20  oundUp,         
10a20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20         /* Round 
10a30 75 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75  up if true.  Rou
10a40 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65  nd down if false
10a50 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
10a60 53 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20  Stat            
10a70 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20    /* OUT: stats 
10a80 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
10a90 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  ){.  IndexSample
10aa0 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78   *aSample = pIdx
10ab0 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74  ->aSample;.  int
10ac0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
10ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10ae0 78 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74  x of required st
10af0 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74  ats in anEq[] et
10b00 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e  c. */.  int iMin
10b10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10b20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
10b30 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74  sample not yet t
10b40 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
10b50 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
10b60 3b 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65  ;      /* Smalle
10b70 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72  st sample larger
10b80 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
10b90 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20  o pRec */.  int 
10ba0 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  iTest;          
10bb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
10bc0 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a  sample to test *
10bd0 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20  /.  int res;    
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bf0 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d  /* Result of com
10c00 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
10c10 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  n */..#ifndef SQ
10c20 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
10c30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70  SED_PARAMETER( p
10c40 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a  Parse );.#endif.
10c50 20 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d    assert( pRec!=
10c60 30 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52  0 );.  iCol = pR
10c70 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a  ec->nField - 1;.
10c80 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
10c90 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
10ca0 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
10cb0 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49  eld>0 && iCol<pI
10cc0 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29  dx->nSampleCol )
10cd0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54 65 73  ;.  do{.    iTes
10ce0 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a  t = (iMin+i)/2;.
10cf0 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
10d00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10d10 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65 73 74  re(aSample[iTest
10d20 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65  ].n, aSample[iTe
10d30 73 74 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29 3b  st].p, pRec, 0);
10d40 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
10d50 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  {.      iMin = i
10d60 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
10d70 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65  e{.      i = iTe
10d80 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  st;.    }.  }whi
10d90 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
10da0 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  i );..#ifdef SQL
10db0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
10dc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
10dd0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
10de0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
10df0 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
10e00 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
10e10 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
10e20 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
10e30 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
10e40 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
10e50 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
10e60 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
10e70 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
10e80 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69  /* If (res==0) i
10e90 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d  s true, then sam
10ea0 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65  ple $i must be e
10eb0 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
10ec0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
10ed0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
10ee0 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
10ef0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
10f00 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
10f10 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
10f20 70 2c 20 70 52 65 63 2c 20 30 29 0a 20 20 20 20  p, pRec, 0).    
10f30 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
10f40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10f50 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
10f60 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 70   /* Otherwise, p
10f70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c  Rec must be smal
10f80 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
10f90 24 69 20 61 6e 64 20 6c 61 72 67 65 72 20 74 68  $i and larger th
10fa0 61 6e 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  an.    ** sample
10fb0 20 28 24 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20   ($i-1).  */.   
10fc0 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
10fd0 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
10fe0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64      || sqlite3Vd
10ff0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
11000 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
11010 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
11020 2c 20 30 29 3e 30 0a 20 20 20 20 20 20 20 20 20  , 0)>0.         
11030 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
11040 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11050 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 0a     assert( i==0.
11060 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
11070 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
11080 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
11090 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
110a0 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29 3c 30 0a  ].p, pRec, 0)<0.
110b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
110c0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
110d0 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iled );.  }.#end
110e0 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
110f0 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f  TE_DEBUG */..  /
11100 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
11110 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
11120 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
11130 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
11140 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75  than.  ** or equ
11150 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20  al to pVal.  Or 
11160 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
11170 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61  ple, then all sa
11180 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20  mples are less. 
11190 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20   ** than pVal.  
111a0 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70  If aSample[i]==p
111b0 56 61 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30  Val, then res==0
111c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
111d0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 53 74 61 74  ==0 ){.    aStat
111e0 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
111f0 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
11200 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d   aStat[1] = aSam
11210 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c  ple[i].anEq[iCol
11220 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
11230 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20  tRowcnt iLower, 
11240 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
11250 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
11260 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a      iLower = 0;.
11270 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
11280 53 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69  Sample[0].anLt[i
11290 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Col];.    }else{
112a0 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
112b0 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
112c0 20 3f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   ? pIdx->aiRowEs
112d0 74 5b 30 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69  t[0] : aSample[i
112e0 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
112f0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
11300 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69  mple[i-1].anEq[i
11310 43 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69  Col] + aSample[i
11320 2d 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  -1].anLt[iCol];.
11330 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
11340 31 5d 20 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79  1] = (pIdx->nKey
11350 43 6f 6c 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d  Col>iCol ? pIdx-
11360 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20  >aAvgEq[iCol] : 
11370 31 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77  1);.    if( iLow
11380 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
11390 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
113a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
113b0 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
113c0 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
113d0 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
113e0 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
113f0 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
11400 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
11410 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
11420 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
11430 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d  ower + iGap;.  }
11440 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11450 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
11460 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  _OR_STAT4 */../*
11470 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11480 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74  n is used to est
11490 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
114a0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
114b0 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a  ll be visited.**
114c0 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20   by scanning an 
114d0 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67  index for a rang
114e0 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65  e of values. The
114f0 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20   range may have 
11500 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e  an upper.** boun
11510 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64  d, a lower bound
11520 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57  , or both. The W
11530 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
11540 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75  s that set the u
11550 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65  pper.** and lowe
11560 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70  r bounds are rep
11570 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77  resented by pLow
11580 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
11590 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a  spectively. For.
115a0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
115b0 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ming that index 
115c0 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a  p is on t1(a):.*
115d0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
115e0 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
115f0 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20  ND a < ? ....** 
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f     |_____|   |__
11620 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___|.**         
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
11640 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65   pLower    pUppe
11670 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  r.**.** If eithe
11680 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f  r of the upper o
11690 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73  r lower bound is
116a0 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
116b0 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65  en NULL is passe
116c0 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66  d in.** place of
116d0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
116e0 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ng WhereTerm..**
116f0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e  .** The value in
11700 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77   (pBuilder->pNew
11710 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69  ->u.btree.nEq) i
11720 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
11730 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
11740 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
11750 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
11760 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
11770 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
11780 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
11790 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
117a0 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
117b0 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
117c0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
117d0 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
117e0 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
117f0 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
11800 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
11810 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
11820 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
11830 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
11840 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
11850 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
11860 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
11870 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
11880 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
11890 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
118a0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
118b0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
118c0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
118d0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
118e0 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
118f0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
11900 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
11910 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
11920 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11930 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
11940 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
11950 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
11960 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
11970 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
11980 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
11990 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
119a0 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
119b0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
119c0 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
119d0 71 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  q is 0, this is 
119e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
119f0 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
11a00 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
11a10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
11a20 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
11a30 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
11a40 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
11a50 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  e range contrain
11a60 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
11a70 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
11a80 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
11a90 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
11aa0 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
11ab0 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
11ac0 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63   be.** used, eac
11ad0 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69  h range inequali
11ae0 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ty reduces the s
11af0 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
11b00 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a   factor of 4. .*
11b10 2a 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f  * Hence a pair o
11b20 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  f constraints (x
11b30 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
11b40 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64  ces the expected
11b50 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f   number of.** ro
11b60 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20  ws visited by a 
11b70 66 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f  factor of 16..*/
11b80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
11b90 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
11ba0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11bb0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11bc0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
11bd0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11be0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
11bf0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68   *pBuilder,.  Wh
11c00 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
11c10 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
11c20 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
11c30 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
11c40 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
11c50 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
11c60 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
11c70 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
11c80 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
11c90 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
11ca0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
11cb0 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74       /* Modify t
11cc0 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79  he .nOut and may
11cd0 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20  be .rRun fields 
11ce0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
11d00 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e  t nOut = pLoop->
11d10 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e  nOut;.  LogEst n
11d20 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  New;..#ifdef SQL
11d30 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
11d40 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65  _OR_STAT4.  Inde
11d50 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
11d60 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
11d70 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
11d80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20  >u.btree.nEq;.. 
11d90 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e   if( p->nSample>
11da0 30 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75  0.   && nEq==pBu
11db0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
11dc0 0a 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53  .   && nEq<p->nS
11dd0 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f  ampleCol.   && O
11de0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
11df0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
11e00 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20  QLITE_Stat3) .  
11e10 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52  ){.    UnpackedR
11e20 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
11e30 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
11e40 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
11e50 20 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20      u8 aff;..   
11e60 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
11e70 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
11e80 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
11e90 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
11ea0 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a   rows in .    **
11eb0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
11ec0 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68  are less than th
11ed0 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66  e lower bound of
11ee0 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79   the range query
11ef0 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77  . The.    ** low
11f00 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74  er bound being t
11f10 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
11f20 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77   of $P and $L, w
11f30 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20  here $P is the. 
11f40 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78     ** key-prefix
11f50 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e   formed by the n
11f60 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65  Eq values matche
11f70 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45  d against the nE
11f80 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20  q left-most.    
11f90 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ** columns of th
11fa0 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20  e index, and $L 
11fb0 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  is the value in 
11fc0 70 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  pLower..    **. 
11fd0 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f     ** Or, if pLo
11fe0 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24  wer is NULL or $
11ff0 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  L cannot be extr
12000 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62  acted from it (b
12010 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a  ecause it.    **
12020 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
12030 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74   variable or lit
12040 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65  eral value), the
12050 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
12060 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
12070 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
12080 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
12090 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
120a0 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
120b0 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76    ** if $L is av
120c0 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65  ailable, whereKe
120d0 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c  yStats() is call
120e0 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29  ed for both ($P)
120f0 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50   and .    ** ($P
12100 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72  :$L) and the lar
12110 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72  ger of the two r
12120 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75  eturned values u
12130 73 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  sed..    **.    
12140 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55  ** Similarly, iU
12150 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65  pper is to be se
12160 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
12170 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
12180 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c  of rows.    ** l
12190 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70  ess than the upp
121a0 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
121b0 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65  range query. Whe
121c0 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  re the upper bou
121d0 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74  nd.    ** is eit
121e0 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a  her ($P) or ($P:
121f0 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e  $U). Again, even
12200 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61   if $U is availa
12210 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ble, both values
12220 0a 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65  .    ** of iUppe
12230 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
12240 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
12250 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
12260 65 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  er used..    */.
12270 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
12280 65 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  er;.    tRowcnt 
12290 69 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28  iUpper;..    if(
122a0 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c   nEq==p->nKeyCol
122b0 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
122c0 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
122d0 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ER;.    }else{. 
122e0 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54       aff = p->pT
122f0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
12300 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66  Column[nEq]].aff
12310 69 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  inity;.    }.   
12320 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c   /* Determine iL
12330 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20  ower and iUpper 
12340 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e  using ($P) only.
12350 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   */.    if( nEq=
12360 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  =0 ){.      iLow
12370 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55  er = 0;.      iU
12380 70 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45  pper = p->aiRowE
12390 73 74 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  st[0];.    }else
123a0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a  {.      /* Note:
123b0 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64   this call could
123c0 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77   be optimized aw
123d0 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73  ay - since the s
123e0 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ame values must 
123f0 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62  .      ** have b
12400 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68  een requested wh
12410 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24  en testing key $
12420 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53  P in whereEqualS
12430 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20  canEst().  */.  
12440 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
12450 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
12460 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
12470 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
12480 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
12490 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d  0] + a[1];.    }
124a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73  ..    /* If poss
124b0 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
124c0 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69   the iLower esti
124d0 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
124e0 4c 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  L). */.    if( p
124f0 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Lower ){.      i
12500 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
12510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12520 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
12530 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
12540 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  xpr */.      Exp
12550 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
12560 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
12570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12580 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
12590 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  or & (WO_GT|WO_G
125a0 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
125b0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
125c0 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
125d0 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
125e0 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
125f0 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69  , &bOk);.      i
12600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12610 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20   && bOk ){.     
12620 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
12630 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
12640 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
12650 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
12660 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
12670 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65  0] + ((pLower->e
12680 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54  Operator & WO_GT
12690 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
126a0 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
126b0 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
126c0 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
126d0 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nOut--;.      }.
126e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
126f0 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
12700 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
12710 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
12720 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
12730 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
12740 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
12770 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
12780 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
12790 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
127a0 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
127b0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
127c0 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f  ert( (pUpper->eO
127d0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54  perator & (WO_LT
127e0 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_LE))!=0 );. 
127f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12800 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
12810 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
12820 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
12830 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
12840 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12850 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
12860 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
12870 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68  iNew;.        wh
12880 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
12890 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20  se, p, pRec, 1, 
128a0 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77  a);.        iNew
128b0 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70   = a[0] + ((pUpp
128c0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
128d0 57 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20  WO_LE) ? a[1] : 
128e0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
128f0 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55  iNew<iUpper ) iU
12900 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  pper = iNew;.   
12910 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
12920 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12930 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
12940 20 70 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72   pRec;.    if( r
12950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12960 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
12970 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20  >iLower ){.     
12980 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65     nNew = sqlite
12990 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d  3LogEst(iUpper -
129a0 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
129b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
129c0 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20  New = 10;       
129d0 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
129e0 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
129f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12a00 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
12a10 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e          nOut = n
12a20 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
12a30 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
12a40 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20   (LogEst)nOut;. 
12a50 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
12a60 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 63  0x10, ("range sc
12a70 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e  an regions: %u..
12a80 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  %u  est=%d\n",. 
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f          (u32)iLo
12ab0 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72  wer, (u32)iUpper
12ac0 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  , nOut));.      
12ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
12af0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
12b00 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
12b10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12b20 28 70 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64  (pBuilder);.#end
12b30 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  if.  assert( pLo
12b40 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b  wer || pUpper );
12b50 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45  .  /* TUNING:  E
12b60 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ach inequality c
12b70 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
12b80 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
12b90 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20  ce 4-fold..  ** 
12ba0 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  A BETWEEN operat
12bb0 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72  or, therefore, r
12bc0 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
12bd0 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20  h space 16-fold 
12be0 2a 2f 0a 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74  */.  nNew = nOut
12bf0 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26  ;.  if( pLower &
12c00 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61  & (pLower->wtFla
12c10 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
12c20 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  ==0 ){.    nNew 
12c30 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73  -= 20;        as
12c40 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65  sert( 20==sqlite
12c50 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20  3LogEst(4) );.  
12c60 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20    nOut--;.  }.  
12c70 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
12c80 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20    nNew -= 20;   
12c90 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d       assert( 20=
12ca0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
12cb0 29 20 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b  ) );.    nOut--;
12cc0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c  .  }.  if( nNew<
12cd0 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a  10 ) nNew = 10;.
12ce0 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
12cf0 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20  ) nOut = nNew;. 
12d00 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
12d10 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
12d20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
12d30 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12d40 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
12d50 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
12d60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
12d70 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
12d80 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
12d90 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
12da0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
12db0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
12dc0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
12dd0 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
12de0 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
12df0 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
12e00 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
12e10 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
12e20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
12e30 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
12e40 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
12e50 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
12e60 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
12e70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
12e80 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
12e90 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
12ea0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
12eb0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
12ec0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
12ed0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
12ee0 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
12ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12f00 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
12f10 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
12f20 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
12f30 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
12f40 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
12f50 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
12f60 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
12f70 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
12f80 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
12f90 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
12fa0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
12fb0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
12fc0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
12fd0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
12fe0 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
12ff0 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
13000 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
13010 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
13020 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
13030 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
13040 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13050 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
13060 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
13070 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
13080 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
13090 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
130a0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
130b0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
130c0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
130d0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
130e0 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
130f0 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
13100 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
13110 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
13120 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
13130 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
13140 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
13150 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
13160 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
13170 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
13180 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
13190 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
131a0 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
131b0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
131c0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
131d0 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
131e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
131f0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
13200 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13220 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
13230 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
13240 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
13250 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
13260 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
13270 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
13280 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
13290 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79  t( nEq<=(p->nKey
132a0 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  Col+1) );.  asse
132b0 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
132c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
132d0 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
132e0 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
132f0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71  r->nRecValid<nEq
13300 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c   );..  /* If val
13310 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69  ues are not avai
13320 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69  lable for all fi
13330 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65  elds of the inde
13340 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  x to the left.  
13350 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20  ** of this one, 
13360 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20  no estimate can 
13370 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20  be made. Return 
13380 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e  SQLITE_NOTFOUND.
13390 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
133a0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e  er->nRecValid<(n
133b0 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  Eq-1) ){.    ret
133c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
133d0 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  UND;.  }..  /* T
133e0 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
133f0 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65  zation only. The
13400 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
13410 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
13420 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  ue().  ** below 
13430 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65  would return the
13440 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f   same value.  */
13450 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b  .  if( nEq>p->nK
13460 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e  eyCol ){.    *pn
13470 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
13480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13490 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   }..  aff = p->p
134a0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
134b0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e  iColumn[nEq-1]].
134c0 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d  affinity;.  rc =
134d0 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
134e0 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
134f0 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
13500 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
13510 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
13520 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
13530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13540 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
13550 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
13560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13570 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
13580 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
13590 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
135a0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
135b0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
135c0 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
135d0 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
135e0 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
135f0 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
13600 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
13610 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13620 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13630 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13640 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
13650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13660 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
13670 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
13680 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
13690 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
136a0 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
136b0 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
136c0 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
136d0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
136e0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
136f0 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
13700 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
13710 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
13720 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
13730 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
13740 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
13750 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
13760 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
13770 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
13780 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
13790 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
137a0 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
137b0 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
137c0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
137d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
137e0 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
137f0 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
13800 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
13810 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
13820 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
13830 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
13840 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13850 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
13860 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
13870 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
13880 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
13890 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
138a0 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
138b0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
138c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
138d0 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
138e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
138f0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
13900 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
13910 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
13920 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
13930 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
13940 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
13950 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
13960 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
13970 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
13980 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
13990 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
139a0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
139b0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
139c0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
139d0 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
139e0 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
139f0 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65  Index;.  int nRe
13a00 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
13a10 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
13a20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13a30 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75  OK;     /* Subfu
13a40 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
13a50 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
13a60 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
13a70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
13a80 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
13a90 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  erm */.  tRowcnt
13aa0 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20   nRowEst = 0;   
13ab0 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
13ac0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
13ad0 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
13ae0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
13af0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13b00 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
13b10 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
13b20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
13b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
13b40 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
13b50 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
13b60 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
13b70 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
13b80 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
13b90 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69  e, pBuilder, pLi
13ba0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
13bb0 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77  &nEst);.    nRow
13bc0 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20  Est += nEst;.   
13bd0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
13be0 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
13bf0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
13c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13c10 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20    if( nRowEst > 
13c20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  p->aiRowEst[0] )
13c30 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69   nRowEst = p->ai
13c40 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a  RowEst[0];.    *
13c50 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
13c60 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
13c70 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  0x10,("IN row es
13c80 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e  timate: est=%g\n
13c90 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
13ca0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
13cb0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
13cc0 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
13cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
13ce0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
13cf0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
13d00 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69  AT4 */../*.** Di
13d10 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
13d20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13d30 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
13d40 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
13d50 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
13d60 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
13d70 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
13d80 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
13d90 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
13da0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
13db0 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
13dc0 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
13dd0 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
13de0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
13df0 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
13e00 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
13e10 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
13e20 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
13e30 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
13e40 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
13e50 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
13e60 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
13e70 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
13e80 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
13e90 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
13ea0 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
13eb0 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
13ec0 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
13ed0 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
13ee0 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
13ef0 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
13f00 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
13f10 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
13f20 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
13f30 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
13f40 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
13f50 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
13f60 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
13f70 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
13f80 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
13f90 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
13fa0 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
13fb0 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
13fc0 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
13fd0 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
13fe0 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
13ff0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
14000 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
14010 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
14020 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
14030 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
14040 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
14050 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
14060 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
14070 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
14080 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
14090 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
140a0 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
140b0 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
140c0 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
140d0 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
140e0 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
140f0 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
14100 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
14110 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
14120 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
14130 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
14140 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
14150 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
14160 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
14170 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
14180 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
14190 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
141a0 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
141b0 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
141c0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
141d0 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
141e0 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
141f0 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
14200 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
14210 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
14220 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
14230 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e     && (pLevel->n
14240 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d  otReady & pTerm-
14250 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20  >prereqAll)==0. 
14260 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
14270 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
14280 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
14290 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
142a0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
142b0 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
142c0 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
142d0 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
142e0 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
142f0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
14300 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
14310 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
14320 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
14330 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14340 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
14350 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
14360 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
14370 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
14380 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
14390 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
143a0 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
143b0 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
143c0 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
143d0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
143e0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
143f0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
14400 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
14410 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
14420 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
14430 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
14440 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
14450 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
14460 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
14470 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14480 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
14490 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
144a0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
144b0 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
144c0 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
144d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
144e0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
144f0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
14500 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
14510 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
14520 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
14530 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
14540 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
14550 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
14560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
14570 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
14580 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
14590 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
145a0 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
145b0 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
145c0 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
145d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
145e0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
145f0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
14600 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
14610 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
14620 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
14630 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
14640 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
14650 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
14660 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
14670 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
14680 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
14690 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
146a0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
146b0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
146c0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
146d0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
146e0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
146f0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
14700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
14720 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
14730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14740 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
14750 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
14760 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
14770 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
14780 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
14790 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
147a0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
147b0 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
147c0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
147d0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
147e0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
147f0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
14800 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
14810 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
14820 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
14830 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
14840 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
14850 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
14860 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
14870 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
14880 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
14890 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
148a0 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
148b0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
148c0 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
148d0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
148e0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
148f0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
14900 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
14910 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
14920 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
14930 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
14940 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
14950 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
14960 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
14970 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
14980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14990 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
149a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
149b0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
149c0 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
149d0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
149e0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
149f0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
14a00 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
14a10 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
14a20 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
14a30 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
14a40 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
14a50 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
14a60 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
14a70 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
14a80 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
14a90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
14aa0 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
14ab0 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
14ac0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
14ad0 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
14ae0 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
14af0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
14b00 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
14b10 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
14b20 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
14b30 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
14b40 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
14b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14b60 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
14b70 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
14b80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
14b90 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
14ba0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
14bb0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
14bc0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
14bd0 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
14be0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
14bf0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
14c00 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
14c10 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
14c20 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
14c30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14c40 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
14c50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14c60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
14c70 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
14c80 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
14c90 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
14ca0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
14cb0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
14cc0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
14cd0 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
14ce0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
14cf0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
14d00 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
14d10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
14d20 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
14d30 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
14d40 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
14d50 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
14d60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
14d70 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
14d80 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
14d90 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
14da0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
14db0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
14dc0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
14dd0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
14de0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
14df0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
14e00 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66  , pX, 0);.    if
14e10 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
14e20 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
14e30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e40 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
14e50 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
14e60 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
14e70 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
14e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14e90 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
14ea0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
14eb0 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65  ab, 0);.    Vdbe
14ec0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
14ed0 65 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ev);.    VdbeCov
14ee0 65 72 61 67 65 49 66 28 76 2c 20 21 62 52 65 76  erageIf(v, !bRev
14ef0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
14f00 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
14f10 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
14f20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ==0 );.    pLoop
14f30 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14f40 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20  RE_IN_ABLE;.    
14f50 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
14f60 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
14f70 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
14f80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14f90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
14fa0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
14fb0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
14fc0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
14fd0 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
14fe0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
14ff0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
15000 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
15010 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
15040 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
15050 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
15060 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
15070 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
15080 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
15090 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
150a0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
150b0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
150c0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
150d0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
150e0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
150f0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
15100 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
15110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15120 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
15130 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
15140 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
15150 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
15160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15170 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
15180 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
15190 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d      }.      pIn-
151a0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52  >eEndLoopOp = bR
151b0 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70  ev ? OP_PrevIfOp
151c0 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70  en : OP_NextIfOp
151d0 65 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  en;.      sqlite
151e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
151f0 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
15200 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15210 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15220 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
15230 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
15240 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
15250 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
15260 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
15270 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
15280 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
15290 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
152a0 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
152b0 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
152c0 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e  n.** index scan.
152d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
152e0 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
152f0 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
15300 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
15310 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
15320 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
15330 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
15340 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
15350 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
15360 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
15370 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
15380 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
15390 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
153a0 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
153b0 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
153c0 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
153d0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
153e0 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
153f0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
15400 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
15410 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
15420 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
15430 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
15440 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
15450 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
15460 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
15470 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
15480 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
15490 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
154a0 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
154b0 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
154c0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
154d0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
154e0 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
154f0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
15500 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
15510 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
15520 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
15530 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
15540 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
15550 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
15560 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
15570 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
15580 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
15590 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
155a0 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
155b0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
155c0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67  ** The nExtraReg
155d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
155e0 6f 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69  or 1.  It is 0 i
155f0 66 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75  f all WHERE clau
15600 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  se constraints.*
15610 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61  * are == or IN a
15620 6e 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  nd are covered b
15630 79 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74  y the nEq.  nExt
15640 72 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68  raReg is 1 if th
15650 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65  ere is.** an ine
15660 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15670 6e 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20  nt (such as the 
15680 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20  "c>=5 AND c<10" 
15690 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
156a0 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61  that.** occurs a
156b0 66 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61  fter the nEq qua
156c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
156d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
156e0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
156f0 20 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45   range of nEq+nE
15700 78 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63  xtraReg memory c
15710 65 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ells and returns
15720 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
15730 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
15740 79 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72  y cell in that r
15750 61 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74  ange. The code t
15760 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
15770 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
15780 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72  se that memory r
15790 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65  ange to store ke
157a0 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20  ys for.** start 
157b0 61 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  and termination 
157c0 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68  conditions of th
157d0 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76  e loop..** key v
157e0 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
157f0 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
15800 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
15810 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
15820 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
15830 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
15840 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
15850 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
15860 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
15870 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
15880 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
15890 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
158a0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
158b0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
158c0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
158d0 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
158e0 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
158f0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
15900 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
15910 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
15920 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
15930 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
15940 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
15950 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
15960 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
15970 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
15980 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
15990 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
159a0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
159b0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
159c0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
159d0 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
159e0 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
159f0 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
15a00 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
15a10 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
15a20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
15a30 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
15a40 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
15a50 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
15a60 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
15a70 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
15a80 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
15a90 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
15aa0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
15ab0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
15ac0 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
15ad0 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
15ae0 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
15af0 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
15b00 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
15b10 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
15b20 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
15b30 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
15b40 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
15b50 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
15b60 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
15b70 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
15b80 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
15b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15ba0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
15bb0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
15bc0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
15bd0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
15be0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
15bf0 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
15c00 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
15c10 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
15c20 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69  re coding */.  i
15c30 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
15c40 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20       /* Reverse 
15c50 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
15c60 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
15c70 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
15c80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15c90 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
15ca0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
15cb0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
15cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15cd0 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
15ce0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
15cf0 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71   */.){.  u16 nEq
15d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15d10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
15d20 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
15d30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
15d40 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53  code */.  u16 nS
15d50 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
15d60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15d70 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63  r of left-most c
15d80 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a  olumns to skip *
15d90 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
15da0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
15db0 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
15dc0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
15dd0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
15e00 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
15e10 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
15e20 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
15e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
15e40 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
15e50 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
15e60 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
15e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15e80 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
15e90 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15ec0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
15ed0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
15ee0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
15ef0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
15f00 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
15f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15f20 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
15f30 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
15f40 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f60 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
15f70 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
15f80 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
15f90 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
15fa0 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
15fb0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
15fc0 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
15fd0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
15fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
15ff0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
16000 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
16010 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
16020 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
16030 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c  Eq;.  nSkip = pL
16040 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
16050 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  ip;.  pIdx = pLo
16060 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
16070 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
16080 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
16090 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
160a0 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
160b0 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
160c0 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
160d0 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
160e0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
160f0 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
16100 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
16110 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
16120 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
16130 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
16140 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
16150 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74  Parse->db, sqlit
16160 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
16170 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20  tr(v, pIdx));.  
16180 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20  if( !zAff ){.   
16190 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
161a0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
161b0 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20   }..  if( nSkip 
161c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  ){.    int iIdxC
161d0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
161e0 78 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  xCur;.    sqlite
161f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28  3VdbeAddOp1(v, (
16200 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f  bRev?OP_Last:OP_
16210 52 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72  Rewind), iIdxCur
16220 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
16230 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
16240 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
16250 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
16260 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
16270 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b  nt((v, "begin sk
16280 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
16290 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
162a0 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64     j = sqlite3Vd
162b0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
162c0 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oto);.    pLevel
162d0 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c  ->addrSkip = sql
162e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
162f0 74 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65  t(v, (bRev?OP_Se
16300 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c  ekLT:OP_SeekGT),
16310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64               iId
16330 78 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65  xCur, 0, regBase
16340 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64  , nSkip);.    Vd
16350 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
16360 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64  bRev==0);.    Vd
16370 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
16380 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71  bRev!=0);.    sq
16390 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
163a0 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72  e(v, j);.    for
163b0 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a  (j=0; j<nSkip; j
163c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
163d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
163e0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
163f0 75 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a  ur, j, regBase+j
16400 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16410 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
16420 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 56  j]>=0 );.      V
16430 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
16440 25 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  %s", pIdx->pTabl
16450 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  e->aCol[pIdx->ai
16460 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
16470 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ));.    }.  }   
16480 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65   ..  /* Evaluate
16490 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
164a0 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
164b0 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30   assert( zAff==0
164c0 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   || (int)strlen(
164d0 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  zAff)>=nEq );.  
164e0 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e  for(j=nSkip; j<n
164f0 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  Eq; j++){.    in
16500 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20  t r1;.    pTerm 
16510 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
16520 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  j];.    assert( 
16530 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
16540 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
16550 20 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75   testcase is tru
16560 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
16570 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
16580 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
16590 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
165a0 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
165b0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
165c0 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
165d0 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
165e0 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
165f0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
16600 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
16610 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
16620 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
16630 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d  TUAL );.    r1 =
16640 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
16650 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
16660 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
16670 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
16680 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
16690 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
166a0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
166b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
166c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
166d0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
166e0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
166f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16710 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16720 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
16730 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
16740 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
16750 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
16760 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
16770 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16780 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
16790 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
167a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
167b0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
167c0 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
167d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
167e0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
167f0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
16800 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
16810 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68  rCanBeNull(pRigh
16820 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
16830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16840 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
16850 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
16860 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
16870 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
16880 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
16890 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
168a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
168b0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
168c0 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
168d0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
168e0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
168f0 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
16900 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
16910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16920 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
16930 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
16940 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
16950 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
16960 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
16970 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
16980 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16990 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
169a0 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
169b0 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
169c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
169d0 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
169e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
169f0 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
16a00 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
16a10 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
16a20 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
16a30 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
16a40 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
16a50 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
16a60 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
16a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
16a80 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
16a90 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16aa0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
16ab0 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
16ac0 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
16ad0 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
16ae0 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
16af0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
16b00 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
16b10 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
16b20 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
16b30 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
16b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16b50 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
16b60 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
16b70 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b90 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
16ba0 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
16bb0 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
16bc0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
16bd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16be0 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
16bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
16c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16c10 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
16c20 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
16c30 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
16c40 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
16c50 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
16c60 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
16c70 6d 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72 2c  mAppendAll(pStr,
16c80 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c   zColumn);.  sql
16c90 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
16ca0 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
16cb0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
16cc0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
16cd0 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
16ce0 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
16cf0 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
16d00 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
16d10 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
16d20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
16d30 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
16d40 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
16d50 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
16d60 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
16d70 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
16d80 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
16d90 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
16da0 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
16db0 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
16dc0 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
16dd0 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
16de0 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
16df0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
16e00 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
16e10 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
16e20 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
16e30 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
16e40 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
16e50 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
16e60 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
16e70 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
16e80 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
16e90 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
16ea0 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
16eb0 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
16ec0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
16ed0 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
16ee0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
16ef0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
16f00 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
16f10 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
16f20 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
16f30 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
16f40 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
16f50 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
16f60 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
16f70 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
16f80 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
16f90 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
16fa0 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c  oop *pLoop, Tabl
16fb0 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
16fc0 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  x *pIndex = pLoo
16fd0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
16fe0 78 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70  x;.  u16 nEq = p
16ff0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
17000 71 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d  q;.  u16 nSkip =
17010 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
17020 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20  nSkip;.  int i, 
17030 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
17040 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
17050 20 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20    i16 *aiColumn 
17060 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
17070 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74  mn;.  StrAccum t
17080 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  xt;..  if( nEq==
17090 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  0 && (pLoop->wsF
170a0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54  lags & (WHERE_BT
170b0 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
170c0 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a  P_LIMIT))==0 ){.
170d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
170e0 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
170f0 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c  cumInit(&txt, 0,
17100 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   0, SQLITE_MAX_L
17110 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62  ENGTH);.  txt.db
17120 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33   = db;.  sqlite3
17130 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
17140 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20  txt, " (", 2);. 
17150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b   for(i=0; i<nEq;
17160 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
17170 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d  *z = (i==pIndex-
17180 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
17190 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
171a0 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[i]].zName;.
171b0 20 20 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70      if( i>=nSkip
171c0 20 29 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69   ){.      explai
171d0 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
171e0 2c 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20  , i, z, "=");.  
171f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
17200 66 28 20 69 20 29 20 73 71 6c 69 74 65 33 53 74  f( i ) sqlite3St
17210 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
17220 74 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  t, " AND ", 5);.
17230 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
17240 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
17250 2c 20 22 41 4e 59 28 22 2c 20 34 29 3b 0a 20 20  , "ANY(", 4);.  
17260 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
17270 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 74 78  cumAppendAll(&tx
17280 74 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, z);.      sql
17290 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
172a0 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
172b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a  ;.    }.  }..  j
172c0 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f   = i;.  if( pLoo
172d0 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
172e0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
172f0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
17300 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
17310 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
17320 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
17330 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
17340 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
17350 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
17360 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
17370 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
17380 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
17390 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
173a0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
173b0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
173c0 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
173d0 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
173e0 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
173f0 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
17400 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
17410 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
17420 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
17430 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
17440 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
17450 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
17460 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
17470 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
17480 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
17490 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
174a0 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
174b0 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
174c0 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
174d0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
174e0 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
174f0 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
17500 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
17510 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
17520 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
17530 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
17540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17550 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
17560 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17580 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
17590 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
175a0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
175b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
175c0 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
175d0 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
175e0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
175f0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
17600 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
17610 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
17620 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
17630 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
17640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
17650 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
17660 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
17670 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
17680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17690 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
176a0 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
176b0 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
176c0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176e0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
176f0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
17700 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69  Begin() */.){.#i
17710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
17720 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
17730 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
17740 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72  ndif.  {.    str
17750 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
17760 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
17770 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
17780 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
17790 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
177a0 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
177b0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
177c0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
177d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
177e0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
177f0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
17800 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17820 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
17830 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
17840 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
17850 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
17860 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
17870 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
17880 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
17890 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
178a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
178b0 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
178c0 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
178d0 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  . */.    WhereLo
178e0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
178f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
17900 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c  ntrolling WhereL
17910 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
17920 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20    u32 flags;    
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65  /* Flags that de
17950 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70  scribe this loop
17960 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d   */..    pLoop =
17970 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
17980 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f  .    flags = pLo
17990 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
179a0 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
179b0 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
179c0 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
179d0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
179e0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
179f0 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73  sSearch = (flags
17a00 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
17a10 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
17a20 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
17a30 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48     || ((flags&WH
17a40 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
17a50 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  )==0 && (pLoop->
17a60 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a  u.btree.nEq>0)).
17a70 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
17a80 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
17a90 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
17aa0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
17ab0 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  );..    zMsg = s
17ac0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
17ad0 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68  , "%s", isSearch
17ae0 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22  ?"SEARCH":"SCAN"
17af0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
17b00 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
17b10 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17b20 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
17b30 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59  sg, "%s SUBQUERY
17b40 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d   %d", zMsg,pItem
17b50 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
17b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
17b70 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
17b80 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
17b90 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  "%s TABLE %s", z
17ba0 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Msg, pItem->zNam
17bb0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
17bc0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
17bd0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
17be0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17bf0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
17c00 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
17c10 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
17c20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
17c30 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
17c40 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
17c50 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41  E))==0.     && A
17c60 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62  LWAYS(pLoop->u.b
17c70 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a  tree.pIndex!=0).
17c80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
17c90 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
17ca0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
17cb0 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
17cc0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
17cd0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17ce0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20  ndf(db, zMsg,.  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66               ((f
17d00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
17d10 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20  O_INDEX) ? .    
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17d30 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54  %s USING AUTOMAT
17d40 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73  IC %sINDEX%.0s%s
17d50 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  " :.            
17d60 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47         "%s USING
17d70 20 25 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c   %sINDEX %s%s"),
17d80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17d90 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26   zMsg, ((flags &
17da0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
17db0 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a   ? "COVERING " :
17dc0 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
17dd0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
17de0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
17df0 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  e, zWhere);.    
17e00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17e10 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  db, zWhere);.   
17e20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
17e30 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
17e40 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  0 && (flags & WH
17e50 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
17e60 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
17e70 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17e80 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17e90 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
17ea0 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
17eb0 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66  g);..      if( f
17ec0 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55  lags&(WHERE_COLU
17ed0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
17ee0 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20  MN_IN) ){.      
17ef0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
17f00 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
17f10 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29  g, "%s (rowid=?)
17f20 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
17f30 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
17f40 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
17f50 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
17f60 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
17f70 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17f80 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17f90 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e   "%s (rowid>? AN
17fa0 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73  D rowid<?)", zMs
17fb0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
17fc0 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
17fd0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
17fe0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
17ff0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
18000 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
18010 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  >?)", zMsg);.   
18020 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
18030 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f  AYS(flags&WHERE_
18040 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20  TOP_LIMIT) ){.  
18050 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
18060 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18070 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
18080 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
18090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
180a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
180b0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
180c0 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73   else if( (flags
180d0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
180e0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
180f0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18100 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18110 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20  sg, "%s VIRTUAL 
18120 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
18130 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  s", zMsg,.      
18140 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
18150 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
18160 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
18170 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
18180 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d  endif.    zMsg =
18190 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
181a0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c  (db, zMsg, "%s",
181b0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69   zMsg);.    sqli
181c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
181d0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
181e0 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
181f0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
18200 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
18210 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
18220 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
18230 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
18240 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
18250 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
18260 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
18270 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
18280 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
18290 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
182a0 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
182b0 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
182c0 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
182d0 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
182e0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
182f0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
18300 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
18310 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
18320 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
18330 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
18340 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
18350 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
18360 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
18370 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
18380 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
18390 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
183a0 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
183b0 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
183c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
183d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
183e0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
183f0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
18400 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
18410 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
18420 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
18430 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
18440 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
18450 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
18460 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
18470 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
18480 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
18490 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
184a0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
184b0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
184c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
184d0 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
184e0 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
184f0 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
18500 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
18510 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
18520 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
18530 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
18540 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20  Loop;    /* The 
18550 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
18560 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
18570 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18580 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
18590 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
185a0 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
185b0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
185c0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
185d0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
185e0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
185f0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
18600 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18610 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
18620 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
18630 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
18640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
18650 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18660 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
18690 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
186a0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
186b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
186c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
186d0 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
186e0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
186f0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
18700 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
18710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
18720 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
18730 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
18740 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
18750 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
18760 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
18770 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
18780 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
18790 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
187a0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
187b0 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
187c0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
187d0 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
187e0 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
187f0 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
18800 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
18810 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
18820 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50  turning */..  pP
18830 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
18840 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
18850 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
18860 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
18870 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
18880 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  >db;.  pLevel = 
18890 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
188a0 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  l];.  pLoop = pL
188b0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
188c0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
188d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
188e0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
188f0 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
18900 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c  m->iCursor;.  pL
18910 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d  evel->notReady =
18920 20 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74   notReady & ~get
18930 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
18940 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
18950 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d   bRev = (pWInfo-
18960 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c  >revMask>>iLevel
18970 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  )&1;.  omitTable
18980 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61   = (pLoop->wsFla
18990 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
189a0 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20  NLY)!=0 .       
189b0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
189c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
189d0 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d  RE_FORCE_TABLE)=
189e0 3d 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65  =0;.  VdbeModule
189f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
18a00 69 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a  in WHERE-loop%d:
18a10 20 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62   %s",iLevel,pTab
18a20 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
18a30 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  e));..  /* Creat
18a40 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65  e labels for the
18a50 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f   "break" and "co
18a60 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74  ntinue" instruct
18a70 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ions.  ** for th
18a80 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
18a90 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b   Jump to addrBrk
18aa0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
18ab0 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75   a loop..  ** Ju
18ac0 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f  mp to cont to go
18ad0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
18ae0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
18af0 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
18b00 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  oop..  **.  ** W
18b10 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20  hen there is an 
18b20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20  IN operator, we 
18b30 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64  also have a "add
18b40 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  rNxt" label that
18b50 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63  .  ** means to c
18b60 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
18b70 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63   next IN value c
18b80 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65  ombination.  Whe
18b90 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65  n.  ** there are
18ba0 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   no IN operators
18bb0 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
18bc0 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78  nts, the "addrNx
18bd0 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73  t" label.  ** is
18be0 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64   the same as "ad
18bf0 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61  drBrk"..  */.  a
18c00 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
18c10 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65  >addrBrk = pLeve
18c20 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
18c30 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18c40 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74  l(v);.  addrCont
18c50 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
18c60 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
18c70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
18c80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18c90 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
18ca0 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
18cb0 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
18cc0 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  nd.  ** initiali
18cd0 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
18ce0 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
18cf0 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
18d00 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77  hes any.  ** row
18d10 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
18d20 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
18d30 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
18d40 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
18d50 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
18d60 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
18d70 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 ){.    pLevel-
18d80 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70  >iLeftJoin = ++p
18d90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
18da0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18db0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
18dc0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 0, pLevel->iLe
18dd0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
18de0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
18df0 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
18e00 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
18e10 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
18e20 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20   case of a FROM 
18e30 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20  clause subquery 
18e40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
18e50 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
18e60 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76   if( pTabItem->v
18e70 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  iaCoroutine ){. 
18e80 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20     int regYield 
18e90 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52  = pTabItem->regR
18ea0 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
18eb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18ec0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
18ed0 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70  , regYield, 0, p
18ee0 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  TabItem->addrFil
18ef0 6c 53 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65  lSub);.    pLeve
18f00 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33  l->p2 =  sqlite3
18f10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18f20 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
18f30 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
18f40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18f50 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
18f60 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f  ((v, "next row o
18f70 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49  f \"%s\"", pTabI
18f80 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
18f90 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
18fa0 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20  op = OP_Goto;.  
18fb0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
18fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
18fd0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
18fe0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
18ff0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
19000 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  BLE)!=0 ){.    /
19010 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74  * Case 1:  The t
19020 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
19030 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68  l-table.  Use th
19040 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e  e VFilter and VN
19050 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ext.    **      
19060 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68      to access th
19070 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  e data..    */. 
19080 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f     int iReg;   /
19090 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f  * P3 Value for O
190a0 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20  P_VFilter */.   
190b0 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e   int addrNotFoun
190c0 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  d;.    int nCons
190d0 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e  traint = pLoop->
190e0 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c  nLTerm;..    sql
190f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
19100 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  h(pParse);.    i
19110 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
19120 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
19130 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
19140 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75  ;.    addrNotFou
19150 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
19160 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  rBrk;.    for(j=
19170 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
19180 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
19190 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67  t iTarget = iReg
191a0 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72  +j+2;.      pTer
191b0 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
191c0 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
191d0 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
191e0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
191f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
19200 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
19210 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54     codeEqualityT
19220 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
19230 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52  m, pLevel, j, bR
19240 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ev, iTarget);.  
19250 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75        addrNotFou
19260 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
19270 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rNxt;.      }els
19280 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
19290 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
192a0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e, pTerm->pExpr-
192b0 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
192c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
192d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
192e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
192f0 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  eger, pLoop->u.v
19300 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67  tab.idxNum, iReg
19310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19330 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61  nteger, nConstra
19340 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  int, iReg+1);.  
19350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19360 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
19370 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74  r, iCur, addrNot
19380 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20  Found, iReg,.   
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
193b0 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  .idxStr,.       
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
193d0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
193e0 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e  dFree ? P4_MPRIN
193f0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
19400 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19410 65 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  e(v);.    pLoop-
19420 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
19430 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
19440 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
19450 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a   && j<16; j++){.
19460 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
19470 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
19480 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20  k>>j)&1 ){.     
19490 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
194a0 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c  Level, pLoop->aL
194b0 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Term[j]);.      
194c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  }.    }.    pLev
194d0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78  el->op = OP_VNex
194e0 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
194f0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
19500 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
19510 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19520 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
19530 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
19540 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
19550 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
19560 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19570 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
19580 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
19590 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
195a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
195b0 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  /..  if( (pLoop-
195c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
195d0 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28  _IPK)!=0.   && (
195e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
195f0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49   (WHERE_COLUMN_I
19600 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  N|WHERE_COLUMN_E
19610 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  Q))!=0.  ){.    
19620 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 63  /* Case 2:  We c
19630 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65  an directly refe
19640 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72  rence a single r
19650 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ow using an.    
19660 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
19670 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
19680 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
19690 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
196a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20   **          we 
196b0 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70  reference multip
196c0 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20  le rows using a 
196d0 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22  "rowid IN (...)"
196e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
196f0 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20   construct..    
19700 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
19710 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
19720 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 65 72  q==1 );.    pTer
19730 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
19740 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
19750 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
19760 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
19770 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  >pExpr!=0 );.   
19780 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
19790 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  le==0 );.    tes
197a0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
197b0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
197c0 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 65 6c  TUAL );.    iRel
197d0 65 61 73 65 52 65 67 20 3d 20 2b 2b 70 50 61 72  easeReg = ++pPar
197e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 52  se->nMem;.    iR
197f0 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71  owidReg = codeEq
19800 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
19810 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
19820 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65  , 0, bRev, iRele
19830 61 73 65 52 65 67 29 3b 0a 20 20 20 20 69 66 28  aseReg);.    if(
19840 20 69 52 6f 77 69 64 52 65 67 21 3d 69 52 65 6c   iRowidReg!=iRel
19850 65 61 73 65 52 65 67 20 29 20 73 71 6c 69 74 65  easeReg ) sqlite
19860 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19870 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65  pParse, iRelease
19880 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Reg);.    addrNx
19890 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
198a0 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Nxt;.    sqlite3
198b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
198c0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77  _MustBeInt, iRow
198d0 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b  idReg, addrNxt);
198e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
198f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19900 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
19910 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61  tExists, iCur, a
19920 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65  ddrNxt, iRowidRe
19930 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  g);.    VdbeCove
19940 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
19950 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
19960 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
19970 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31  se, iRowidReg, 1
19980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
19990 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
199a0 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
199b0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56  RowidReg);.    V
199c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
199d0 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  pk"));.    pLeve
199e0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
199f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
19a00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19a10 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20  HERE_IPK)!=0.   
19a20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
19a30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
19a40 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d  _COLUMN_RANGE)!=
19a50 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
19a60 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61  se 3:  We have a
19a70 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
19a80 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
19a90 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
19aa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
19ab0 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
19ac0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b  ;.    int start;
19ad0 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56  .    int memEndV
19ae0 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68  alue = 0;.    Wh
19af0 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
19b00 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73   *pEnd;..    ass
19b10 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
19b20 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  0 );.    j = 0;.
19b30 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
19b40 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  d = 0;.    if( p
19b50 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
19b60 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
19b70 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70  ) pStart = pLoop
19b80 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
19b90 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
19ba0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
19bb0 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d  P_LIMIT ) pEnd =
19bc0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
19bd0 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ++];.    assert(
19be0 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45   pStart!=0 || pE
19bf0 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nd!=0 );.    if(
19c00 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
19c10 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20  Term = pStart;. 
19c20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
19c30 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  nd;.      pEnd =
19c40 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
19c50 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
19c60 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
19c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19c80 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
19c90 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73  at defines the s
19ca0 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  tart bound */.  
19cb0 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d      int r1, rTem
19cc0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  p;        /* Reg
19cd0 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69  isters for holdi
19ce0 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  ng the start bou
19cf0 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20  ndary */..      
19d00 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
19d10 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54   constant maps T
19d20 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20  K_xx codes into 
19d30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20  corresponding . 
19d40 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63       ** seek opc
19d50 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64  odes.  It depend
19d60 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  s on a particula
19d70 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b  r ordering of TK
19d80 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  _xx.      */.   
19d90 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76     const u8 aMov
19da0 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  eOp[] = {.      
19db0 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f       /* TK_GT */
19dc0 20 20 4f 50 5f 53 65 65 6b 47 54 2c 0a 20 20 20    OP_SeekGT,.   
19dd0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45          /* TK_LE
19de0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a   */  OP_SeekLE,.
19df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
19e00 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LT */  OP_SeekL
19e10 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,.           /*
19e20 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_GE */  OP_Se
19e30 65 6b 47 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ekGE.      };.  
19e40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
19e50 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20  E==TK_GT+1 );   
19e60 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
19e70 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a  the ordering.. *
19e80 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
19e90 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
19ea0 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f  ;      /*  ... o
19eb0 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75  f the TK_xx valu
19ec0 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  es... */.      a
19ed0 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
19ee0 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+3 );      /*
19ef0 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63    ... is correcc
19f00 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  t. */..      ass
19f10 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74  ert( (pStart->wt
19f20 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
19f30 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  LL)==0 );.      
19f40 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74  testcase( pStart
19f50 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
19f60 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
19f70 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70    pX = pStart->p
19f80 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
19f90 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
19fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74     testcase( pSt
19fb0 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  art->leftCursor!
19fc0 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e  =iCur ); /* tran
19fd0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
19fe0 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d  ts */.      r1 =
19ff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a000 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d  Temp(pParse, pX-
1a010 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29  >pRight, &rTemp)
1a020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a030 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f  dbeAddOp3(v, aMo
1a040 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47  veOp[pX->op-TK_G
1a050 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  T], iCur, addrBr
1a060 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
1a070 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
1a080 6b 22 29 29 3b 0a 20 20 20 20 20 20 56 64 62 65  k"));.      Vdbe
1a090 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
1a0a0 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  ->op==TK_GT);.  
1a0b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a0c0 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
1a0d0 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LE);.      Vdbe
1a0e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
1a0f0 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20  ->op==TK_LT);.  
1a100 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a110 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
1a120 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  _GE);.      sqli
1a130 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1a140 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1a150 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
1a160 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a170 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a180 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73  Temp);.      dis
1a190 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1a1a0 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65   pStart);.    }e
1a1b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1a1c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a1d0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
1a1e0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
1a1f0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
1a200 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a210 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
1a220 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a230 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
1a240 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45      }.    if( pE
1a250 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1a260 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d   *pX;.      pX =
1a270 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20   pEnd->pExpr;.  
1a280 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
1a290 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1a2a0 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67  t( (pEnd->wtFlag
1a2b0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1a2c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a2d0 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74  case( pEnd->left
1a2e0 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20  Cursor!=iCur ); 
1a2f0 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f  /* Transitive co
1a300 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
1a310 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e     testcase( pEn
1a320 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1a330 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1a340 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d     memEndValue =
1a350 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a370 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1a380 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e  X->pRight, memEn
1a390 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  dValue);.      i
1a3a0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
1a3b0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
1a3c0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  T ){.        tes
1a3d0 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1a3e0 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
1a3f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a400 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
1a410 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
1a420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69        }.      di
1a430 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1a440 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20  , pEnd);.    }. 
1a450 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
1a460 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1a470 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  r(v);.    pLevel
1a480 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
1a490 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
1a4a0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1a4b0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
1a4c0 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
1a4d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
1a4e0 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
1a4f0 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
1a500 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
1a510 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72  owidReg = ++pPar
1a520 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1a530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a540 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1a550 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1a560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a570 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1a580 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1a590 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1a5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a5b0 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65  p3(v, testOp, me
1a5c0 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42  mEndValue, addrB
1a5d0 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  rk, iRowidReg);.
1a5e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1a5f0 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d  geIf(v, testOp==
1a600 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Le);.      Vd
1a610 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1a620 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  testOp==OP_Lt);.
1a630 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1a640 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d  geIf(v, testOp==
1a650 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ge);.      Vd
1a660 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1a670 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  testOp==OP_Gt);.
1a680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a690 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
1a6a0 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
1a6b0 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
1a6c0 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ULL);.    }.  }e
1a6d0 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
1a6e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1a6f0 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a  NDEXED ){.    /*
1a700 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20   Case 4: A scan 
1a710 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
1a720 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1a730 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
1a740 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
1a750 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
1a760 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
1a770 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
1a780 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
1a790 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
1a7a0 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
1a7b0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
1a7c0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
1a7d0 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
1a7e0 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
1a7f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
1a800 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1a810 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
1a820 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
1a830 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
1a840 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
1a850 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1a860 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
1a870 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
1a880 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
1a890 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
1a8a0 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
1a8b0 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
1a8c0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
1a8d0 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
1a8e0 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
1a8f0 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
1a900 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1a910 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
1a920 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
1a930 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1a940 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
1a950 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
1a960 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
1a970 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1a980 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
1a990 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1a9a0 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
1a9b0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1a9c0 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1a9d0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1a9e0 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
1a9f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1aa00 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
1aa10 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
1aa20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1aa30 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
1aa40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
1aa50 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
1aa60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1aa70 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
1aa80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1aa90 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
1aaa0 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
1aab0 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
1aac0 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
1aad0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
1aae0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
1aaf0 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
1ab00 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
1ab10 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ab20 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
1ab30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ab40 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
1ab50 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1ab60 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
1ab70 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
1ab80 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
1ab90 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
1aba0 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
1abb0 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
1abc0 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
1abd0 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
1abe0 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
1abf0 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
1ac00 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
1ac10 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
1ac20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61      */  .    sta
1ac30 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1ac40 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
1ac50 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
1ac60 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20      OP_Rewind,  
1ac70 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
1ac80 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1ac90 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1aca0 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20    !bRev) */.    
1acb0 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20    OP_Last,      
1acc0 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73         /* 3: (!s
1acd0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1ace0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
1acf0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
1ad00 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20 20 20  OP_SeekGT,      
1ad10 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
1ad20 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1ad30 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
1ad40 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1ad50 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20 20 20  _SeekLT,        
1ad60 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f     /* 5: (start_
1ad70 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1ad80 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65  !startEq &&  bRe
1ad90 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1ada0 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20 20 20  eekGE,          
1adb0 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f   /* 6: (start_co
1adc0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1add0 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
1ade0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1adf0 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 2f  kLE            /
1ae00 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
1ae10 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
1ae20 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
1ae30 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  /.    };.    sta
1ae40 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
1ae50 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dOp[] = {.      
1ae60 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
1ae70 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e 64 5f       /* 0: (end_
1ae80 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
1ae90 62 52 65 76 20 26 26 20 21 65 6e 64 45 71 29 20  bRev && !endEq) 
1aea0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
1aeb0 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,            /*
1aec0 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
1aed0 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
1aee0 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20    endEq) */.    
1aef0 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20 20 20    OP_IdxLE,     
1af00 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
1af10 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1af20 20 20 62 52 65 76 20 26 26 20 21 65 6e 64 45 71    bRev && !endEq
1af30 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1af40 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLT,            
1af50 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 3: (end_const
1af60 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
1af70 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20  &&  endEq) */.  
1af80 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45 71    };.    u16 nEq
1af90 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1afa0 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e 75  e.nEq;     /* Nu
1afb0 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
1afc0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e   terms */.    in
1afd0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1afe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1aff0 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
1b000 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
1b010 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 57 68 65  alues */.    Whe
1b020 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74  reTerm *pRangeSt
1b030 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65  art = 0;  /* Ine
1b040 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1b050 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72  nt at range star
1b060 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  t */.    WhereTe
1b070 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20  rm *pRangeEnd = 
1b080 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c  0;    /* Inequal
1b090 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
1b0a0 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20  t range end */. 
1b0b0 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20     int startEq; 
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65  /* True if range
1b0e0 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20   start uses ==, 
1b0f0 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1b100 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20  int endEq;      
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b120 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e  True if range en
1b130 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  d uses ==, >= or
1b140 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73   <= */.    int s
1b150 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1b160 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
1b170 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e   of range is con
1b180 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20  strained */.    
1b190 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1b0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
1b1c0 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20  aint terms */.  
1b1d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b1f0 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77  * The index we w
1b200 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a  ill be using */.
1b210 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b      int iIdxCur;
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b230 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
1b240 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
1b250 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78  x */.    int nEx
1b260 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20  traReg = 0;     
1b270 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b280 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
1b290 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20  rs needed */.   
1b2a0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2c0 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63   Instruction opc
1b2d0 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ode */.    char 
1b2e0 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20  *zStartAff;     
1b2f0 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1b300 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66  ity for start of
1b310 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1b320 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 45  t */.    char cE
1b330 6e 64 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20  ndAff = 0;      
1b340 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1b350 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e  y for end of ran
1b360 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
1b370 0a 20 20 20 20 75 38 20 62 53 65 65 6b 50 61 73  .    u8 bSeekPas
1b380 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  tNull = 0;      
1b390 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 65    /* True to see
1b3a0 6b 20 70 61 73 74 20 69 6e 69 74 69 61 6c 20 6e  k past initial n
1b3b0 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38 20 62  ulls */.    u8 b
1b3c0 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30 3b 20  StopAtNull = 0; 
1b3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1b3e0 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74 65 72  condition to ter
1b3f0 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c 73 20  minate at NULLs 
1b400 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70  */..    pIdx = p
1b410 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1b420 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43 75  ndex;.    iIdxCu
1b430 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
1b440 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Cur;.    assert(
1b450 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62   nEq>=pLoop->u.b
1b460 74 72 65 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20  tree.nSkip );.. 
1b470 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f     /* If this lo
1b480 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73  op satisfies a s
1b490 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65  ort order (pOrde
1b4a0 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61  rBy) request tha
1b4b0 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61  t .    ** was pa
1b4c0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1b4d0 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65  ction to impleme
1b4e0 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  nt a "SELECT min
1b4f0 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a  (x) ..." .    **
1b500 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65   query, then the
1b510 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c   caller will onl
1b520 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70  y allow the loop
1b530 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20   to run for.    
1b540 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72  ** a single iter
1b550 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ation. This mean
1b560 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  s that the first
1b570 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20   row returned.  
1b580 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20    ** should not 
1b590 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75  have a NULL valu
1b5a0 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e  e stored in 'x'.
1b5b0 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69   If column 'x' i
1b5c0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72  s.    ** the fir
1b5d0 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65  st one after the
1b5e0 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f   nEq equality co
1b5f0 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
1b600 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74   index,.    ** t
1b610 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d  his requires som
1b620 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
1b630 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ng..    */.    i
1b640 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
1b650 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
1b660 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20  ERBY_MIN)!=0.   
1b670 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f    && (pWInfo->bO
1b680 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20 26 26  BSat!=0).     &&
1b690 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
1b6a0 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
1b6b0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
1b6c0 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d  >u.btree.nSkip==
1b6d0 30 20 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b  0 );.      bSeek
1b6e0 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  PastNull = 1;.  
1b6f0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1b700 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1b710 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61   Find any inequa
1b720 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1b730 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74  terms for the st
1b740 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20  art and end .   
1b750 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65   ** of the range
1b760 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20  . .    */.    j 
1b770 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
1b780 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1b790 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1b7a0 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53  ){.      pRangeS
1b7b0 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1b7c0 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
1b7d0 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
1b7e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
1b7f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1b800 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1b810 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e  {.      pRangeEn
1b820 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
1b830 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45  m[j++];.      nE
1b840 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1b850 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61     if( pRangeSta
1b860 72 74 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  rt==0.       && 
1b870 28 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  (j = pIdx->aiCol
1b880 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20  umn[nEq])>=0 .  
1b890 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54       && pIdx->pT
1b8a0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  able->aCol[j].no
1b8b0 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 29  tNull==0.      )
1b8c0 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65 6b 50  {.        bSeekP
1b8d0 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20  astNull = 1;.   
1b8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1b8f0 73 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64  ssert( pRangeEnd
1b900 3d 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e  ==0 || (pRangeEn
1b910 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1b920 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a  M_VNULL)==0 );..
1b930 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1b940 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1b950 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
1b960 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
1b970 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
1b980 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
1b990 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
1b9a0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
1b9b0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1b9c0 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
1b9d0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1b9e0 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
1b9f0 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
1ba00 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65  Parse,pLevel,bRe
1ba10 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74  v,nExtraReg,&zSt
1ba20 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73  artAff);.    ass
1ba30 65 72 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d  ert( zStartAff==
1ba40 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c  0 || sqlite3Strl
1ba50 65 6e 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e  en30(zStartAff)>
1ba60 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20  =nEq );.    if( 
1ba70 7a 53 74 61 72 74 41 66 66 20 29 20 63 45 6e 64  zStartAff ) cEnd
1ba80 41 66 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b  Aff = zStartAff[
1ba90 6e 45 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78  nEq];.    addrNx
1baa0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1bab0 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Nxt;..    /* If 
1bac0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72  we are doing a r
1bad0 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61  everse order sca
1bae0 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  n on an ascendin
1baf0 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20  g index, or.    
1bb00 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64  ** a forward ord
1bb10 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73  er scan on a des
1bb20 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69  cending index, i
1bb30 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a  nterchange the .
1bb40 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64      ** start and
1bb50 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e   end terms (pRan
1bb60 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e  geStart and pRan
1bb70 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  geEnd)..    */. 
1bb80 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78     if( (nEq<pIdx
1bb90 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65  ->nKeyCol && bRe
1bba0 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f  v==(pIdx->aSortO
1bbb0 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
1bbc0 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20  E_SO_ASC)).     
1bbd0 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78  || (bRev && pIdx
1bbe0 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a  ->nKeyCol==nEq).
1bbf0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41      ){.      SWA
1bc00 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70  P(WhereTerm *, p
1bc10 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65  RangeEnd, pRange
1bc20 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 53 57  Start);.      SW
1bc30 41 50 28 75 38 2c 20 62 53 65 65 6b 50 61 73 74  AP(u8, bSeekPast
1bc40 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75 6c  Null, bStopAtNul
1bc50 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  l);.    }..    t
1bc60 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1bc70 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
1bc80 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1bc90 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
1bca0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1bcb0 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
1bcc0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1bcd0 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
1bce0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1bcf0 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
1bd00 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1bd10 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
1bd20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1bd30 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
1bd40 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1bd50 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
1bd60 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d  );.    startEq =
1bd70 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
1bd80 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
1bd90 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
1bda0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64  |WO_GE);.    end
1bdb0 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e  Eq =   !pRangeEn
1bdc0 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d || pRangeEnd->
1bdd0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1bde0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73  LE|WO_GE);.    s
1bdf0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1be00 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
1be10 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a  | nEq>0;..    /*
1be20 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20   Seek the index 
1be30 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74  cursor to the st
1be40 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
1be50 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72  . */.    nConstr
1be60 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
1be70 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  if( pRangeStart 
1be80 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1be90 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74  Right = pRangeSt
1bea0 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
1beb0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
1bec0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1bed0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1bee0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
1bef0 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  ( (pRangeStart->
1bf00 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1bf10 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20  NULL)==0.       
1bf20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1bf30 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a  nBeNull(pRight).
1bf40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1bf50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bf60 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1bf70 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
1bf80 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  drNxt);.        
1bf90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1bfa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bfb0 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a  f( zStartAff ){.
1bfc0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1bfd0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1bfe0 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ty(pRight, zStar
1bff0 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  tAff[nEq])==SQLI
1c000 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
1c010 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
1c020 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1c030 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
1c040 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
1c050 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
1c060 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
1c070 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
1c080 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
1c090 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
1c0a0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
1c0b0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
1c0c0 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
1c0d0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
1c0e0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1c0f0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1c100 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c110 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1c120 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1c130 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
1c140 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
1c150 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
1c160 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1c170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c180 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73   }  .      nCons
1c190 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
1c1a0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
1c1b0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1c1c0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1c1d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
1c1e0 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a  SeekPastNull ){.
1c1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c200 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1c210 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
1c220 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  Eq);.      nCons
1c230 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
1c240 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20  startEq = 0;.   
1c250 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
1c260 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ints = 1;.    }.
1c270 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
1c280 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
1c290 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1c2a0 6e 74 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75  nt - bSeekPastNu
1c2b0 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  ll, zStartAff);.
1c2c0 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f      op = aStartO
1c2d0 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  p[(start_constra
1c2e0 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72  ints<<2) + (star
1c2f0 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b  tEq<<1) + bRev];
1c300 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21  .    assert( op!
1c310 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1c320 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1c330 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
1c340 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
1c350 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
1c360 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1c370 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  v);.    VdbeCove
1c380 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1c390 5f 52 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63  _Rewind);  testc
1c3a0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  ase( op==OP_Rewi
1c3b0 6e 64 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nd );.    VdbeCo
1c3c0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1c3d0 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73  OP_Last);    tes
1c3e0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61  tcase( op==OP_La
1c3f0 73 74 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  st );.    VdbeCo
1c400 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1c410 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73  OP_SeekGT);  tes
1c420 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1c430 65 6b 47 54 20 29 3b 0a 20 20 20 20 56 64 62 65  ekGT );.    Vdbe
1c440 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1c450 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74  ==OP_SeekGE);  t
1c460 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c470 53 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 56 64  SeekGE );.    Vd
1c480 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c490 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20  op==OP_SeekLE); 
1c4a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c4b0 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20  P_SeekLE );.    
1c4c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1c4d0 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
1c4e0 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1c4f0 3d 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 0a 20  =OP_SeekLT );.. 
1c500 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
1c510 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
1c520 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1c530 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
1c540 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
1c550 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
1c560 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
1c570 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
1c580 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
1c590 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1c5a0 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  t = pRangeEnd->p
1c5b0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
1c5c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c5d0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1c5e0 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  e, regBase+nEq, 
1c5f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1c600 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1c610 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1c620 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
1c630 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
1c640 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1c650 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  LL)==0.       &&
1c660 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
1c670 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20  eNull(pRight).  
1c680 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
1c690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c6a0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1c6b0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
1c6c0 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Nxt);.        Vd
1c6d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1c6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c6f0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1c700 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
1c710 63 45 6e 64 41 66 66 29 21 3d 53 51 4c 49 54 45  cEndAff)!=SQLITE
1c720 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20  _AFF_NONE.      
1c730 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
1c740 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
1c750 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 63 45  hange(pRight, cE
1c760 6e 64 41 66 66 29 0a 20 20 20 20 20 20 29 7b 0a  ndAff).      ){.
1c770 20 20 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c          codeAppl
1c780 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
1c790 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
1c7a0 2c 20 26 63 45 6e 64 41 66 66 29 3b 0a 20 20 20  , &cEndAff);.   
1c7b0 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73     }.      nCons
1c7c0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
1c7d0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
1c7e0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1c7f0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1c800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74     }else if( bSt
1c810 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  opAtNull ){.    
1c820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c830 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1c840 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
1c850 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30  .      endEq = 0
1c860 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
1c870 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  int++;.    }.   
1c880 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c890 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a  b, zStartAff);..
1c8a0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1c8b0 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
1c8c0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1c8d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1c8e0 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
1c8f0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1c900 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
1c910 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
1c920 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
1c930 20 20 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e    if( nConstrain
1c940 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20  t ){.      op = 
1c950 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20  aEndOp[bRev*2 + 
1c960 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71  endEq];.      sq
1c970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1c980 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
1c990 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
1c9a0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1c9b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c9c0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20  e( op==OP_IdxGT 
1c9d0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
1c9e0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
1c9f0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
1ca00 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
1ca10 47 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  GE );  VdbeCover
1ca20 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1ca30 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74  IdxGE );.      t
1ca40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1ca50 49 64 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f  IdxLT );  VdbeCo
1ca60 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1ca70 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
1ca80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ca90 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62  OP_IdxLE );  Vdb
1caa0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1cab0 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20  p==OP_IdxLE );. 
1cac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65     }..    /* See
1cad0 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
1cae0 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
1caf0 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
1cb00 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
1cb10 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
1cb20 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1cb30 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
1cb40 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29   if( omitTable )
1cb50 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20  {.      /* pIdx 
1cb60 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  is a covering in
1cb70 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  dex.  No need to
1cb80 20 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e   access the main
1cb90 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d   table. */.    }
1cba0 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69  else if( HasRowi
1cbb0 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20  d(pIdx->pTable) 
1cbc0 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1cbd0 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
1cbe0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
1cbf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cc00 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
1cc10 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
1cc20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cc30 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1cc40 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1cc50 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1cc60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cc70 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
1cc80 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1cc90 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
1cca0 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  eek */.    }else
1ccb0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1ccc0 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
1ccd0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
1cce0 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->pTable);.     
1ccf0 20 69 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c   iRowidReg = sql
1cd00 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1cd10 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b  (pParse, pPk->nK
1cd20 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f  eyCol);.      fo
1cd30 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
1cd40 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
1cd50 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33       k = sqlite3
1cd60 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1cd70 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  dx, pPk->aiColum
1cd80 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  n[j]);.        s
1cd90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cda0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1cdb0 49 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69  IdxCur, k, iRowi
1cdc0 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  dReg+j);.      }
1cdd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cde0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1cdf0 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72  P_NotFound, iCur
1ce00 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20  , addrCont,.    
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 20 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67         iRowidReg
1ce30 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
1ce40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ce50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ce60 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
1ce70 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
1ce80 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
1ce90 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20  p. Disable .    
1cea0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
1ceb0 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e  terms made redun
1cec0 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65  dant by the inde
1ced0 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20  x range scan..  
1cee0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
1cef0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1cf00 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20  ERE_ONEROW ){.  
1cf10 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1cf20 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
1cf30 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
1cf40 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1cf50 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
1cf60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
1cf70 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
1cf80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  t;.    }.    pLe
1cf90 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
1cfa0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1cfb0 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  3 = (pLoop->wsFl
1cfc0 61 67 73 26 57 48 45 52 45 5f 55 4e 51 5f 57 41  ags&WHERE_UNQ_WA
1cfd0 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a  NTED)!=0 ? 1:0;.
1cfe0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1cff0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d000 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29  CONSTRAINT)==0 )
1d010 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1d020 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
1d030 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
1d040 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
1d050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d060 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
1d070 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
1d080 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d090 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
1d0a0 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  ON.  if( pLoop->
1d0b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d0c0 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
1d0d0 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20  /* Case 5:  Two 
1d0e0 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
1d0f0 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ly indexed terms
1d100 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
1d110 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1d120 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1d130 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
1d140 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29  ABLE t1(a,b,c,d)
1d150 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1d160 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1d170 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (a);.    **   CR
1d180 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
1d190 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(b);.    **  
1d1a0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
1d1b0 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a   ON t1(c);.    *
1d1c0 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
1d1d0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1d1e0 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20  E a=5 OR b=7 OR 
1d1f0 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a  (c=11 AND d=13).
1d200 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
1d210 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68   the example, th
1d220 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e  ere are three in
1d230 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
1d240 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20  ected by OR..   
1d250 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   ** The top of t
1d260 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69  he loop looks li
1d270 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
1d280 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1d290 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
1d2b0 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
1d2c0 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20   reg 1.    **.  
1d2d0 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65    ** Then, for e
1d2e0 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ach indexed term
1d2f0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e  , the following.
1d300 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
1d310 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54  o.    ** RowSetT
1d320 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61  est are such tha
1d330 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  t the rowid of t
1d340 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
1d350 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a  s inserted.    *
1d360 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65  * into the RowSe
1d370 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  t. If it is alre
1d380 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e  ady present, con
1d390 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20  trol skips the. 
1d3a0 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f     ** Gosub opco
1d3b0 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72  de and jumps str
1d3c0 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64  aight to the cod
1d3d0 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57  e generated by W
1d3e0 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a  hereEnd()..    *
1d3f0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1d400 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1d410 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a  n(<term>).    **
1d420 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74            RowSet
1d430 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Test            
1d440 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72        # Insert r
1d450 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74  owid into rowset
1d460 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d470 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a   Gosub      2 A.
1d480 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
1d490 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
1d4a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
1d4b0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76  llowing the abov
1d4c0 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69  e, code to termi
1d4d0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c  nate the loop. L
1d4e0 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67  abel A, the targ
1d4f0 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  et.    ** of the
1d500 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75   Gosub above, ju
1d510 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72  mps to the instr
1d520 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74  uction right aft
1d530 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20  er the Goto..   
1d540 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1d550 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
1d580 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
1d590 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20  *          Goto 
1d5a0 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20        B         
1d5b0 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f         # The loo
1d5c0 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20  p is finished.. 
1d5d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d5e0 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79     A: <loop body
1d5f0 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
1d600 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c    # Return data,
1d610 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a   whatever..    *
1d620 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1d630 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20    Return     2  
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d650 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  Jump back to the
1d660 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20   Gosub.    **.  
1d670 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61    **       B: <a
1d680 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20  fter the loop>. 
1d690 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
1d6a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
1d6b0 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
1d6c0 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
1d6d0 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
1d6e0 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
1d6f0 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
1d700 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
1d710 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
1d720 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
1d730 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
1d740 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
1d750 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
1d760 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1d770 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
1d780 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
1d790 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
1d7a0 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
1d7b0 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
1d7c0 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
1d7d0 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
1d7e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
1d7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1d800 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
1d810 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
1d820 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
1d830 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1d850 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
1d860 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
1d870 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d890 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1d8a0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
1d8b0 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
1d8c0 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
1d8d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1d8e0 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
1d8f0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1d900 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1d930 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
1d940 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
1d950 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
1d960 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d970 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
1d980 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
1d990 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
1d9a0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1d9d0 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e  */.    Expr *pAn
1d9e0 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20  dExpr = 0;      
1d9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
1da00 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65  ".. AND (...)" e
1da10 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1da20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1da30 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1da40 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1da50 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1da60 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
1da70 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
1da80 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
1da90 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1daa0 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
1dab0 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
1dac0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
1dad0 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
1dae0 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
1daf0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1db00 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
1db10 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
1db20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
1db30 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
1db40 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
1db50 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
1db60 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
1db70 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
1db80 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
1db90 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
1dba0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
1dbb0 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
1dbc0 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
1dbd0 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
1dbe0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
1dbf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1dc00 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
1dc10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
1dc20 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
1dc30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dc40 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
1dc50 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
1dc60 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1dc70 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
1dc80 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
1dc90 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
1dca0 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
1dcb0 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
1dcc0 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
1dcd0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
1dce0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
1dcf0 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20  ocRaw(db,.      
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
1dd20 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
1dd30 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
1dd40 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
1dd50 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
1dd60 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
1dd70 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
1dd80 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52  loc = (u8)(nNotR
1dd90 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
1dda0 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
1ddb0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
1ddc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
1ddd0 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
1dde0 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
1ddf0 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
1de00 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
1de10 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
1de20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
1de30 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
1de40 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
1de50 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
1de60 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
1de70 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
1de80 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
1de90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1dea0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
1deb0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1dec0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ded0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
1dee0 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
1def0 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
1df00 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
1df10 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
1df20 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
1df30 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
1df40 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
1df50 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
1df60 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
1df70 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
1df80 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
1df90 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1dfa0 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
1dfb0 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
1dfc0 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
1dfd0 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
1dfe0 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
1dff0 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
1e000 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
1e010 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
1e020 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
1e030 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
1e040 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
1e050 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1e060 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
1e070 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
1e080 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
1e090 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
1e0a0 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
1e0b0 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
1e0c0 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
1e0d0 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
1e0e0 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
1e0f0 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
1e100 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
1e110 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
1e120 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
1e130 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1e140 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
1e150 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
1e160 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
1e170 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1e180 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
1e190 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1e1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e1b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1e1c0 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74  ll, 0, regRowset
1e1d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  );.    }.    iRe
1e1e0 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
1e1f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e200 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
1e210 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
1e220 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
1e230 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
1e240 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
1e250 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
1e260 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
1e270 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
1e280 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
1e290 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
1e2a0 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
1e2b0 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
1e2c0 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
1e2d0 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
1e2e0 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
1e2f0 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
1e300 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
1e310 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1e320 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
1e330 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
1e340 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
1e350 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
1e360 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
1e370 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
1e380 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
1e390 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
1e3a0 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
1e3b0 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
1e3c0 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
1e3d0 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
1e3e0 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
1e3f0 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
1e400 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
1e410 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
1e420 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
1e430 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1e440 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
1e450 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
1e460 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
1e470 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
1e480 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
1e490 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1e4a0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
1e4b0 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
1e4c0 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
1e4d0 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
1e4e0 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
1e4f0 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
1e500 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
1e510 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
1e520 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
1e530 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
1e540 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
1e550 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
1e560 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
1e570 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
1e580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
1e590 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
1e5a0 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
1e5b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
1e5c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e5d0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1e5e0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1e5f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e600 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
1e610 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
1e620 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 74  NFO );.        t
1e630 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b  estcase( pWC->a[
1e640 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
1e650 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1e660 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43  .        if( pWC
1e670 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
1e680 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46  gs & (TERM_ORINF
1e690 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20  O|TERM_VIRTUAL) 
1e6a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e6b0 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
1e6c0 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72  iTerm].eOperator
1e6d0 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20   & WO_ALL)==0 ) 
1e6e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e6f0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1e700 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
1e710 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
1e720 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
1e730 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41  e3ExprAnd(db, pA
1e740 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
1e750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e760 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
1e770 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
1e780 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1e790 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
1e7a0 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
1e7b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e7c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1e7d0 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
1e7e0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
1e7f0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
1e800 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
1e810 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
1e820 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1e830 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65  r || (pOrTerm->e
1e840 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
1e850 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1e860 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
1e870 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
1e880 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
1e890 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
1e8a0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
1e8b0 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
1e8c0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1e8d0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
1e8e0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
1e8f0 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f  rty(pOrExpr, EP_
1e900 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1e910 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
1e920 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
1e930 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
1e940 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
1e950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e960 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
1e970 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
1e980 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
1e990 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
1e9a0 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
1e9b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1e9c0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
1e9d0 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
1e9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e9f0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
1ea00 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
1ea10 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
1ea20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
1ea30 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
1ea40 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
1ea50 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
1ea60 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  Y, iCovCur);.   
1ea70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1ea80 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
1ea90 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1eaa0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1eab0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
1eac0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
1ead0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
1eae0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
1eaf0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1eb10 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
1eb20 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
1eb30 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
1eb40 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
1eb50 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
1eb60 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
1eb70 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1eb80 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
1eb90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1eba0 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
1ebb0 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
1ebc0 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
1ebd0 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
1ebe0 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
1ebf0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1ec00 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
1ec10 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31  abItem->pTab, -1
1ec20 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20  , iCur, .       
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a    regRowid, 0);.
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ec70 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1ec80 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
1ec90 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20  t, regRowset,.  
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ecc0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1ecd0 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69  tAddr(v)+2, r, i
1ece0 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
1ecf0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1ed00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1ed10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ed20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ed30 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72  _Gosub, regRetur
1ed40 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  n, iLoopBody);..
1ed50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ed60 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
1ed70 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d  stedTerms flag m
1ed80 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f  eans that this O
1ed90 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  R term.         
1eda0 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e   ** contained on
1edb0 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65  e or more AND te
1edc0 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61  rm from a notRea
1edd0 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20  dy table.  The. 
1ede0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
1edf0 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65  s from the notRe
1ee00 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20  ady table could 
1ee10 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e  not be tested an
1ee20 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  d will.         
1ee30 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74   ** need to be t
1ee40 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20  ested later..   
1ee50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ee60 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
1ee70 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
1ee80 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73   ) untestedTerms
1ee90 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
1eea0 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   /* If all of th
1eeb0 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  e OR-connected t
1eec0 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a  erms are optimiz
1eed0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
1eee0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
1eef0 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e  ndex, and the in
1ef00 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73  dex is opened us
1ef10 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72  ing the same cur
1ef20 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  sor number.     
1ef30 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20       ** by each 
1ef40 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
1ef50 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65  hereBegin() made
1ef60 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69   by this loop, i
1ef70 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20  t may.          
1ef80 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
1ef90 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78  o use that index
1efa0 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
1efb0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
1efc0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
1efd0 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  If the call to s
1efe0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1eff0 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65  () above resulte
1f000 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74  d in a scan that
1f010 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
1f020 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64  es an index, and
1f030 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
1f040 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e  the first OR-con
1f050 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20  nected term.    
1f060 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1f070 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20  ed or the index 
1f080 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1f090 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20  hat used by all 
1f0a0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1f0b0 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74     ** terms, set
1f0c0 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e   pCov to the can
1f0d0 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
1f0e0 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65  index. Otherwise
1f0f0 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20  , set .         
1f100 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c   ** pCov to NULL
1f110 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1f120 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63  t no candidate c
1f130 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69  overing index wi
1f140 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ll .          **
1f150 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20   be available.. 
1f160 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1f170 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d        pSubLoop =
1f180 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
1f190 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  .pWLoop;.       
1f1a0 20 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62     assert( (pSub
1f1b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1f1c0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
1f1d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1f1e0 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d    if( (pSubLoop-
1f1f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1f200 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
1f210 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d          && (ii==
1f220 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  0 || pSubLoop->u
1f230 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70  .btree.pIndex==p
1f240 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  Cov).          )
1f250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
1f260 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d  sert( pSubWInfo-
1f270 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69  >a[0].iIdxCur==i
1f280 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20  CovCur );.      
1f290 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75        pCov = pSu
1f2a0 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
1f2b0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20  Index;.         
1f2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f2d0 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20      pCov = 0;.  
1f2e0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f2f0 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74       /* Finish t
1f300 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  he loop through 
1f310 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
1f320 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
1f330 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
1f340 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1f350 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a  End(pSubWInfo);.
1f360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f370 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  }.    }.    pLev
1f380 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20  el->u.pCovidx = 
1f390 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43  pCov;.    if( pC
1f3a0 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ov ) pLevel->iId
1f3b0 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a  xCur = iCovCur;.
1f3c0 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
1f3d0 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78   ){.      pAndEx
1f3e0 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
1f3f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f400 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45  Delete(db, pAndE
1f410 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
1f420 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1f430 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
1f440 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1f450 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
1f460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f470 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1f480 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
1f490 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
1f4a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f4b0 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
1f4c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
1f4d0 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
1f4e0 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20  e3StackFree(db, 
1f4f0 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28  pOrTab);.    if(
1f500 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20   !untestedTerms 
1f510 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c  ) disableTerm(pL
1f520 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
1f530 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1f540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
1f550 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
1f560 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20    {.    /* Case 
1f570 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  6:  There is no 
1f580 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57  usable index.  W
1f590 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70  e must do a comp
1f5a0 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lete.    **     
1f5b0 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
1f5c0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
1f5d0 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
1f5e0 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b   const u8 aStep[
1f5f0 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f  ] = { OP_Next, O
1f600 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74  P_Prev };.    st
1f610 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1f620 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65  tart[] = { OP_Re
1f630 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b  wind, OP_Last };
1f640 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65  .    assert( bRe
1f650 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20  v==0 || bRev==1 
1f660 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 49  );.    if( pTabI
1f670 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65  tem->isRecursive
1f680 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62   ){.      /* Tab
1f690 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52 65 63  les marked isRec
1f6a0 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e 6c 79  ursive have only
1f6b0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 74 68   a single row th
1f6c0 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  at is stored in.
1f6d0 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65 75 64        ** a pseud
1f6e0 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65  o-cursor.  No ne
1f6f0 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f 72 20  ed to Rewind or 
1f700 4e 65 78 74 20 73 75 63 68 20 63 75 72 73 6f 72  Next such cursor
1f710 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76  s. */.      pLev
1f720 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
1f730 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f740 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1f750 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20  aStep[bRev];.   
1f760 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1f770 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  iCur;.      pLev
1f780 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
1f790 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f7a0 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20  , aStart[bRev], 
1f7b0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
1f7c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f7d0 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
1f7e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1f7f0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d  rageIf(v, bRev!=
1f800 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  0);.      pLevel
1f810 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
1f820 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
1f830 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20  N_STEP;.    }.  
1f840 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
1f850 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
1f860 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
1f870 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
1f880 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
1f890 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
1f8a0 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
1f8b0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
1f8c0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
1f8d0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
1f8e0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
1f8f0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
1f900 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1f910 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1f920 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1f930 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1f940 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1f950 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69  M_CODED );.    i
1f960 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
1f970 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
1f980 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
1f990 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1f9a0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
1f9b0 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  All & pLevel->no
1f9c0 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
1f9d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
1f9e0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
1f9f0 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
1fa00 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
1fa10 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1fa20 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1fa30 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
1fa40 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
1fa50 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
1fa60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1fa70 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
1fa80 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
1fa90 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
1faa0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
1fab0 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
1fac0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
1fad0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1fae0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1faf0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fb00 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1fb10 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
1fb20 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
1fb30 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
1fb40 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
1fb50 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
1fb60 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
1fb70 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65   test for implie
1fb80 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61  d constraints ba
1fb90 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76  sed on transitiv
1fba0 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ity.  ** of the 
1fbb0 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20  "==" operator.. 
1fbc0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1fbd0 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  : If the WHERE c
1fbe0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22  lause contains "
1fbf0 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22  t1.a=t2.b" and "
1fc00 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61  t2.b=123".  ** a
1fc10 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  nd we are coding
1fc20 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
1fc30 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73   the t2 loop has
1fc40 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a   not yet coded,.
1fc50 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e    ** then we can
1fc60 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e  not use the "t1.
1fc70 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69  a=t2.b" constrai
1fc80 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63  nt, but we can c
1fc90 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70  ode.  ** the imp
1fca0 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20  lied "t1.a=123" 
1fcb0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
1fcc0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
1fcd0 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
1fce0 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
1fcf0 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
1fd00 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20  *pE, *pEAlt;.   
1fd10 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74   WhereTerm *pAlt
1fd20 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
1fd30 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
1fd40 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
1fd50 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
1fd60 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1fd70 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45  eOperator!=(WO_E
1fd80 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f  QUIV|WO_EQ) ) co
1fd90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1fda0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
1fdb0 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  r!=iCur ) contin
1fdc0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ue;.    if( pLev
1fdd0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20  el->iLeftJoin ) 
1fde0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
1fdf0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1fe00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1fe10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1fe20 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
1fe30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1fe40 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1fe50 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  t & pLevel->notR
1fe60 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20  eady)!=0 );.    
1fe70 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  pAlt = findTerm(
1fe80 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d  pWC, iCur, pTerm
1fe90 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20  ->u.leftColumn, 
1fea0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
1feb0 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69  WO_IN, 0);.    i
1fec0 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e  f( pAlt==0 ) con
1fed0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
1fee0 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  Alt->wtFlags & (
1fef0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
1ff00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74  ntinue;.    test
1ff10 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
1ff20 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
1ff30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1ff40 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
1ff50 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64   WO_IN );.    Vd
1ff60 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
1ff70 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73  (v, "begin trans
1ff80 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
1ff90 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d  "));.    pEAlt =
1ffa0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
1ffb0 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
1ffc0 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20 20 69  (*pEAlt));.    i
1ffd0 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20 20 20  f( pEAlt ){.    
1ffe0 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74    *pEAlt = *pAlt
1fff0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
20000 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45  EAlt->pLeft = pE
20010 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
20020 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
20030 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c 74 2c  e(pParse, pEAlt,
20040 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
20050 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
20060 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 63       sqlite3Stac
20070 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c 74 29  kFree(db, pEAlt)
20080 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
20090 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
200a0 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
200b0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
200c0 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
200d0 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65   that.  ** at le
200e0 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
200f0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
20100 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
20110 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a  eft table.  .  *
20120 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
20130 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
20140 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
20150 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
20160 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
20170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20190 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
201a0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
201b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
201c0 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49  "record LEFT JOI
201d0 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71  N hit"));.    sq
201e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
201f0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
20200 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
20210 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
20220 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
20230 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
20240 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
20250 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
20260 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AL );.      test
20270 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
20280 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
20290 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
202a0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
202b0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
202c0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
202d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
202e0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
202f0 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  l & pLevel->notR
20300 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
20310 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
20320 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
20330 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  s );.        con
20340 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
20350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
20360 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
20370 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
20380 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
20390 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72  erm->pExpr, addr
203a0 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
203b0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
203c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
203d0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
203e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
203f0 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  n pLevel->notRea
20400 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dy;.}..#if defin
20410 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
20420 41 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65  ABLED) && define
20430 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
20440 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
20450 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 22 45 78  .** Generate "Ex
20460 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65 78 74 20  planation" text 
20470 66 6f 72 20 61 20 57 68 65 72 65 54 65 72 6d 2e  for a WhereTerm.
20480 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20490 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d  whereExplainTerm
204a0 28 56 64 62 65 20 2a 76 2c 20 57 68 65 72 65 54  (Vdbe *v, WhereT
204b0 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 63  erm *pTerm){.  c
204c0 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20  har zType[4];.  
204d0 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e  memcpy(zType, ".
204e0 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66 28 20 70  ..", 4);.  if( p
204f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
20500 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a  TERM_VIRTUAL ) z
20510 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20  Type[0] = 'V';. 
20520 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
20530 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
20540 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
20550 45 27 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  E';.  if( ExprHa
20560 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
20570 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
20580 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20  oin) ) zType[2] 
20590 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69 74 65 33  = 'L';.  sqlite3
205a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c  ExplainPrintf(v,
205b0 20 22 25 73 20 22 2c 20 7a 54 79 70 65 29 3b 0a   "%s ", zType);.
205c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
205d0 45 78 70 72 28 76 2c 20 70 54 65 72 6d 2d 3e 70  Expr(v, pTerm->p
205e0 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Expr);.}.#endif 
205f0 2f 2a 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  /* WHERETRACE_EN
20600 41 42 4c 45 44 20 26 26 20 53 51 4c 49 54 45 5f  ABLED && SQLITE_
20610 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
20620 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20  AIN */...#ifdef 
20630 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
20640 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  ED./*.** Print a
20650 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
20660 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  t for debugging 
20670 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74  purposes.*/.stat
20680 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
20690 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70  pPrint(WhereLoop
206a0 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65   *p, WhereClause
206b0 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49   *pWC){.  WhereI
206c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57  nfo *pWInfo = pW
206d0 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74  C->pWInfo;.  int
206e0 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d   nb = 1+(pWInfo-
206f0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b  >pTabList->nSrc+
20700 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53  7)/8;.  struct S
20710 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
20720 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
20730 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54  bList->a + p->iT
20740 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ab;.  Table *pTa
20750 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
20760 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
20770 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a  rintf("%c%2d.%0*
20780 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
20790 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
207a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
207b0 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
207c0 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
207d0 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  q);.  sqlite3Deb
207e0 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73 22  ugPrintf(" %12s"
207f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20800 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41         pItem->zA
20810 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
20820 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
20830 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  me);.  if( (p->w
20840 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
20850 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
20860 29 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ){.     const ch
20870 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
20880 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
20890 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20  Index && (zName 
208a0 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
208b0 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  dex->zName)!=0 )
208c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
208d0 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
208e0 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
208f0 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
20900 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
20910 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
20920 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
20930 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
20940 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
20950 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
20960 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
20970 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
20980 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
20990 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
209a0 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
209b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
209c0 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
209d0 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
209e0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
209f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
20a00 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
20a10 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
20a20 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
20a30 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
20a40 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
20a50 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
20a60 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
20a70 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
20a80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20a90 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
20aa0 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
20ab0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
20ac0 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
20ad0 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
20ae0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
20af0 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
20b00 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
20b10 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73  free(z);.  }.  s
20b20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20b30 66 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22  f(" f %04x N %d"
20b40 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
20b50 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69  >nLTerm);.  sqli
20b60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
20b70 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
20b80 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
20b90 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
20ba0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20bb0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
20bc0 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 30  IN.  /* If the 0
20bd0 78 31 30 30 20 62 69 74 20 6f 66 20 77 68 65 72  x100 bit of wher
20be0 65 74 72 61 63 69 6e 67 20 69 73 20 73 65 74 2c  etracing is set,
20bf0 20 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20 6f   then show all o
20c00 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  f the constraint
20c10 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
20c20 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f  s in the WhereLo
20c30 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20 61 72 72 61  op.aLTerm[] arra
20c40 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
20c50 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69  >nLTerm && (sqli
20c60 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
20c70 30 78 31 30 30 29 21 3d 30 20 29 7b 20 20 2f 2a  0x100)!=0 ){  /*
20c80 20 57 48 45 52 45 54 52 41 43 45 20 30 78 31 30   WHERETRACE 0x10
20c90 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 */.    int i;.
20ca0 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57      Vdbe *v = pW
20cb0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56  Info->pParse->pV
20cc0 64 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dbe;.    sqlite3
20cd0 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b  ExplainBegin(v);
20ce0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20cf0 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b  p->nLTerm; i++){
20d00 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
20d10 20 2a 70 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54   *pTerm = p->aLT
20d20 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  erm[i];.      if
20d30 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e  ( pTerm==0 ) con
20d40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c  tinue;.      sql
20d50 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
20d60 66 28 76 2c 20 22 20 20 28 25 64 29 20 23 25 2d  f(v, "  (%d) #%-
20d70 32 64 20 22 2c 20 69 2b 31 2c 20 28 69 6e 74 29  2d ", i+1, (int)
20d80 28 70 54 65 72 6d 2d 70 57 43 2d 3e 61 29 29 3b  (pTerm-pWC->a));
20d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20da0 70 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a 20 20  plainPush(v);.  
20db0 20 20 20 20 77 68 65 72 65 45 78 70 6c 61 69 6e      whereExplain
20dc0 54 65 72 6d 28 76 2c 20 70 54 65 72 6d 29 3b 0a  Term(v, pTerm);.
20dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20de0 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20  lainPop(v);.    
20df0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
20e00 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NL(v);.    }.   
20e10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46   sqlite3ExplainF
20e20 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71  inish(v);.    sq
20e30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20e40 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64  ("%s", sqlite3Vd
20e50 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29  beExplanation(v)
20e60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
20e70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
20e80 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
20e90 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
20ea0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
20eb0 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
20ec0 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
20ed0 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
20ee0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
20ef0 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
20f00 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
20f10 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
20f20 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
20f30 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
20f40 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
20f50 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
20f60 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
20f70 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
20f80 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
20f90 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
20fa0 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
20fb0 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
20fc0 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
20fd0 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
20fe0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
20ff0 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
21000 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
21010 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
21020 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
21030 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
21040 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21050 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
21060 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
21070 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
21080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
21090 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
210a0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
210b0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
210c0 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
210d0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
210e0 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
210f0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
21100 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
21110 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
21120 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
21130 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
21140 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
21150 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
21160 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
21170 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72 65 65 2e  nref(p->u.btree.
21180 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49 6e 66 6f  pIndex->pKeyInfo
21190 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
211a0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
211b0 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
211c0 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
211d0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
211e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
211f0 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
21200 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
21210 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
21220 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
21230 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
21240 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
21250 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
21260 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
21270 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
21280 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21290 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
212a0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
212b0 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
212c0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
212d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
212e0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
212f0 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
21300 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
21310 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
21320 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
21330 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
21340 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
21350 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
21360 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
21370 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
21380 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
21390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
213a0 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
213b0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
213c0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
213d0 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
213e0 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
213f0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
21400 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
21410 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
21420 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
21430 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
21440 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
21450 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
21460 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
21470 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
21480 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
21490 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
214a0 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
214b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
214c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
214d0 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
214e0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
214f0 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
21500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21510 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
21520 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
21530 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
21540 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
21550 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
21560 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
21570 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
21580 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
21590 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
215a0 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
215b0 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
215c0 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
215d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
215e0 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
215f0 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
21600 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
21610 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
21620 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
21630 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
21640 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
21650 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
21660 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
21670 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
21680 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
21690 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
216a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
216b0 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
216c0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
216d0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
216e0 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
216f0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
21700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
21720 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
21730 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
21740 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
21750 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
21760 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
21770 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
21780 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
21790 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
217a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
217b0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
217c0 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
217d0 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
217e0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
217f0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
21800 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
21810 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77  pWInfo) ){.    w
21820 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
21830 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
21840 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
21850 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
21860 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
21870 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
21880 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
21890 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
218a0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
218b0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
218c0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
218d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
218e0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
218f0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
21900 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
21910 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
21920 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
21930 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
21940 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
21950 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
21960 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
21970 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
21980 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
21990 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
219a0 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
219b0 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
219c0 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
219d0 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
219e0 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
219f0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
21a00 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
21a10 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
21a20 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
21a30 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
21a40 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
21a50 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
21a60 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
21a70 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
21a80 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
21a90 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Set is not NULL 
21aa0 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72  then we only car
21ab0 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65  e about only the
21ac0 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65  .** prerequisite
21ad0 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e  s and rRun and n
21ae0 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65  Out costs of the
21af0 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20   N best loops.  
21b00 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  That.** informat
21b10 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20  ion is gathered 
21b20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d  in the pBuilder-
21b30 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20  >pOrSet object. 
21b40 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a   This special.**
21b50 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65   processing mode
21b60 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f   is used only fo
21b70 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
21b80 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  essing..**.** Wh
21b90 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  en accumulating 
21ba0 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28  multiple loops (
21bb0 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70  when pBuilder->p
21bc0 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77  OrSet is NULL) w
21bd0 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74  e.** still might
21be0 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c   overwrite simil
21bf0 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68  ar loops with th
21c00 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  e new template i
21c10 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74  f the.** templat
21c20 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
21c30 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
21c40 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
21c50 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
21c60 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
21c70 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
21c80 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
21c90 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
21ca0 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
21cb0 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
21cc0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
21cd0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
21ce0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
21cf0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
21d00 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
21d10 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
21d20 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
21d30 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
21d40 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
21d50 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35 29 20 20  loop.**    (5)  
21d60 54 68 65 20 74 65 6d 70 6c 61 74 65 20 75 73 65  The template use
21d70 73 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  s more terms of 
21d80 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 62  the same index b
21d90 75 74 20 68 61 73 20 6e 6f 20 61 64 64 69 74 69  ut has no additi
21da0 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  onal.**         
21db0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 20 20 20  dependencies    
21dc0 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63        .*/.static
21dd0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e   int whereLoopIn
21de0 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  sert(WhereLoopBu
21df0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
21e00 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
21e10 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c  plate){.  WhereL
21e20 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70  oop **ppPrev, *p
21e30 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  , *pNext = 0;.  
21e40 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
21e50 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
21e60 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
21e70 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
21e80 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
21e90 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
21ea0 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20  Set is defined, 
21eb0 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74  then only keep t
21ec0 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74  rack of the cost
21ed0 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65  s.  ** and prere
21ee0 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  qs..  */.  if( p
21ef0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21  Builder->pOrSet!
21f00 3d 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54  =0 ){.#if WHERET
21f10 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
21f20 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65   u16 n = pBuilde
21f30 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20  r->pOrSet->n;.  
21f40 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
21f50 0a 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65  .    whereOrInse
21f60 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
21f70 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
21f80 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
21f90 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
21fc0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
21fd0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
21fe0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
21ff0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
22000 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
22010 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22020 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
22030 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
22040 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
22050 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
22060 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
22070 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
22080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
22090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
220a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
220b0 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
220c0 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f  g WhereLoop to o
220d0 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69  verwrite, or whi
220e0 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72  ch takes.  ** pr
220f0 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d  iority over pTem
22100 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  plate..  */.  fo
22110 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f  r(ppPrev=&pWInfo
22120 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50  ->pLoops, p=*ppP
22130 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26  rev; p; ppPrev=&
22140 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d  p->pNextLoop, p=
22150 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66  *ppPrev){.    if
22160 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
22170 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d  late->iTab || p-
22180 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70  >iSortIdx!=pTemp
22190 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29  late->iSortIdx )
221a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69  {.      /* If ei
221b0 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72  ther the iTab or
221c0 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73   iSortIdx values
221d0 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f   for two WhereLo
221e0 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  op are different
221f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
22200 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  hose WhereLoops 
22210 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
22220 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79  dered separately
22230 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20  .  Neither is.  
22240 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61      ** a candida
22250 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  te to replace th
22260 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  e other. */.    
22270 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
22280 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20  }.    /* In the 
22290 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
222a0 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74  tation, the rSet
222b0 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  up value is eith
222c0 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f  er zero.    ** o
222d0 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75  r the cost of bu
222e0 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
222f0 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e  tic index (NlogN
22300 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a  ) and the NlogN.
22310 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
22320 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c  me for compatibl
22330 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f  e WhereLoops. */
22340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
22350 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65  rSetup==0 || pTe
22360 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d  mplate->rSetup==
22370 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
22380 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70      || p->rSetup
22390 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
223a0 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77  tup );..    /* w
223b0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
223c0 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61  () always genera
223d0 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20  tes and inserts 
223e0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
223f0 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  dex.    ** case 
22400 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f  first.  Hence co
22410 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61  mpatible candida
22420 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  te WhereLoops ne
22430 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65  ver have a large
22440 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e  r.    ** rSetup.
22450 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50   Call this SETUP
22460 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20  -INVARIANT */.  
22470 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
22480 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
22490 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69  rSetup );..    i
224a0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
224b0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
224c0 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20  q)==p->prereq.  
224d0 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
224e0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
224f0 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  up.     && p->rR
22500 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un<=pTemplate->r
22510 52 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e  Run.     && p->n
22520 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out<=pTemplate->
22530 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20  nOut.    ){.    
22540 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
22550 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73   taken when p is
22560 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72   equal or better
22570 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20   than pTemplate 
22580 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  in .      ** all
22590 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e   of (1) dependen
225a0 63 69 65 73 20 28 32 29 20 73 65 74 75 70 2d 63  cies (2) setup-c
225b0 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73  ost, (3) run-cos
225c0 74 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  t, and.      ** 
225d0 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  (4) number of ou
225e0 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20  tput rows. */.  
225f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
22600 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
22610 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20  ->rSetup );.    
22620 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 3d    if( p->prereq=
22630 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
22640 65 71 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  eq.       && p->
22650 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65  nLTerm<pTemplate
22660 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20  ->nLTerm.       
22670 26 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  && (p->wsFlags &
22680 20 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c   pTemplate->wsFl
22690 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
226a0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
226b0 26 20 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  & (p->u.btree.pI
226c0 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ndex==pTemplate-
226d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a  >u.btree.pIndex.
226e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65            || pTe
226f0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e  mplate->rRun+p->
22700 6e 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b  nLTerm<=p->rRun+
22710 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
22720 6d 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  m).      ){.    
22730 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
22740 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
22750 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73  reLoop with an s
22760 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20  imilar one that 
22770 75 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uses.        ** 
22780 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68  more terms of th
22790 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
227a0 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
227b0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  extLoop;.       
227c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
227d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
227e0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74  pTemplate is not
227f0 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20   helpful..      
22800 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68    ** Return with
22810 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20  out changing or 
22820 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  adding anything 
22830 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
22840 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f  whereLoopInsert_
22850 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  noop;.      }.  
22860 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e    }.    if( (p->
22870 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
22880 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
22890 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
228a0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
228b0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a  pTemplate->rRun.
228c0 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e       && p->nOut>
228d0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
228e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
228f0 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   Overwrite an ex
22900 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
22910 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f   with a better o
22920 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a  ne: one that is.
22930 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
22940 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65  at one of (1) de
22950 70 65 6e 64 65 6e 63 69 65 73 2c 20 28 32 29 20  pendencies, (2) 
22960 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20  setup-cost, (3) 
22970 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a  run-cost.      *
22980 2a 20 6f 72 20 28 34 29 20 6e 75 6d 62 65 72 20  * or (4) number 
22990 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20  of output rows, 
229a0 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73 65 20  and is no worse 
229b0 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 0a  in any of those.
229c0 20 20 20 20 20 20 2a 2a 20 63 61 74 65 67 6f 72        ** categor
229d0 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ies. */.      as
229e0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
229f0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
22a00 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
22a10 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
22a20 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  /.      pNext = 
22a30 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
22a40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22a50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
22a60 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
22a70 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
22a80 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
22a90 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
22aa0 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
22ab0 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
22ac0 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
22ad0 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
22ae0 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
22af0 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
22b00 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
22b10 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
22b20 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
22b30 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
22b40 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
22b50 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
22b60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22b70 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20  rintf("ins-del: 
22b80 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
22b90 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75  LoopPrint(p, pBu
22ba0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
22bb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
22bc0 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e  bugPrintf("ins-n
22bd0 65 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65  ew:  ");.    whe
22be0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
22bf0 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
22c00 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >pWC);.  }.#endi
22c10 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  f.  if( p==0 ){.
22c20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
22c30 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
22c40 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
22c50 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
22c60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22c70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65  NOMEM;.    where
22c80 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d  LoopInit(p);.  }
22c90 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  .  whereLoopXfer
22ca0 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
22cb0 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f  e);.  p->pNextLo
22cc0 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70  op = pNext;.  *p
22cd0 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28  pPrev = p;.  if(
22ce0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
22cf0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
22d00 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
22d10 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
22d20 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
22d30 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
22d40 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
22d50 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
22d60 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
22d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22d90 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
22da0 69 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73  if the insert is
22db0 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72   a no-op */.wher
22dc0 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
22dd0 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  :.#if WHERETRACE
22de0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
22df0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
22e00 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
22e10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
22e20 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
22e30 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77 68  noop: ");.    wh
22e40 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
22e50 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
22e60 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->pWC);.  }.#end
22e70 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
22e80 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  TE_OK;  .}../*.*
22e90 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
22ea0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
22eb0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
22ec0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
22ed0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
22ee0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
22ef0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
22f00 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
22f10 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
22f20 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ndex..**.** In t
22f30 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
22f40 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66  mentation, the f
22f50 69 72 73 74 20 65 78 74 72 61 20 57 48 45 52 45  irst extra WHERE
22f60 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64   clause term red
22f70 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  uces.** the numb
22f80 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
22f90 73 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  s by a factor of
22fa0 20 31 30 20 61 6e 64 20 65 61 63 68 20 61 64 64   10 and each add
22fb0 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20  itional term.** 
22fc0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
22fd0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
22fe0 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f  s by sqrt(2)..*/
22ff0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
23000 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
23010 73 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  st(WhereClause *
23020 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pWC, WhereLoop *
23030 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54  pLoop){.  WhereT
23040 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b  erm *pTerm, *pX;
23050 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c  .  Bitmask notAl
23060 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d  lowed = ~(pLoop-
23070 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d  >prereq|pLoop->m
23080 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20  askSelf);.  int 
23090 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70  i, j;..  if( !Op
230a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
230b0 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  d(pWC->pWInfo->p
230c0 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
230d0 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20  E_AdjustOutEst) 
230e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
230f0 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e   }.  for(i=pWC->
23100 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
23110 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
23120 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
23130 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
23140 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
23150 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
23160 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
23170 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
23180 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
23190 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
231a0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
231b0 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
231c0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
231d0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
231e0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
231f0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
23200 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
23210 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
23220 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23230 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
23240 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
23250 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
23260 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
23270 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
23280 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
23290 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
232a0 30 20 29 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  0 ) pLoop->nOut 
232b0 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
232c0 72 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rob;.  }.}../*.*
232d0 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72  * We have so far
232e0 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65   matched pBuilde
232f0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
23300 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68  .nEq terms of th
23310 65 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a  e index pIndex..
23320 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20  ** Try to match 
23330 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20  one more..**.** 
23340 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d  If pProbe->tnum=
23350 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70  =0, that means p
23360 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20  Index is a fake 
23370 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74  index used for t
23380 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
23390 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74  IMARY KEY..*/.st
233a0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
233b0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
233c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
233d0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
233e0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
233f0 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20  oop factory */. 
23400 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
23410 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
23420 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
23430 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
23440 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  zed */.  Index *
23450 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20  pProbe,         
23460 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
23470 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a  ndex on pSrc */.
23480 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20    LogEst nInMul 
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20    /* log(Number 
234b0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75  of iterations du
234c0 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20  e to IN) */.){. 
234d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
234e0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
234f0 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45  WInfo;  /* WHERE
23500 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74   analyse context
23510 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
23520 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
23530 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  arse;        /* 
23540 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23550 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
23560 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
23570 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
23580 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c   connection mall
23590 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  oc context */.  
235a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235c0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
235d0 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73  eLoop under cons
235e0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  truction */.  Wh
235f0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23610 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64   A WhereTerm und
23620 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
23630 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b   */.  int opMask
23640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23650 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f        /* Valid o
23660 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e  perators for con
23670 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68  straints */.  Wh
23680 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20  ereScan scan;   
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236a0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48   Iterator for WH
236b0 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42  ERE terms */.  B
236c0 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65  itmask saved_pre
236d0 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f  req;           /
236e0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
236f0 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71   of pNew->prereq
23700 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
23710 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
23720 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
23730 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
23740 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36  >nLTerm */.  u16
23750 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20   saved_nEq;     
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23770 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
23780 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
23790 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  nEq */.  u16 sav
237a0 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20  ed_nSkip;       
237b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
237c0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
237d0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
237e0 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
237f0 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
23800 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
23810 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
23820 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
23830 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
23840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23850 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
23860 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
23870 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
238a0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
238b0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
238c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
238f0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 3b   LogEst nRowEst;
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e   /* Estimated in
23920 64 65 78 20 73 65 6c 65 63 74 69 76 69 74 79 20  dex selectivity 
23930 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
23940 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
23950 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
23960 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
23970 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
23980 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
23990 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
239a0 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
239b0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
239c0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
239d0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
239e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
239f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23a00 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
23a10 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
23a20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
23a30 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
23a40 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
23a50 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
23a60 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
23a70 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
23a80 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
23a90 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
23aa0 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
23ab0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
23ac0 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
23ad0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
23ae0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
23af0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
23b00 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
23b10 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
23b20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
23b30 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
23b40 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
23b50 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
23b60 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
23b70 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
23b80 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
23b90 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
23ba0 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
23bb0 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
23bc0 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
23bd0 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66  >nKeyCol );.  if
23be0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
23bf0 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b  nEq < pProbe->nK
23c00 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f  eyCol ){.    iCo
23c10 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
23c20 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
23c30 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f  ee.nEq];.    nRo
23c40 77 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  wEst = sqlite3Lo
23c50 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  gEst(pProbe->aiR
23c60 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74  owEst[pNew->u.bt
23c70 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20  ree.nEq+1]);.   
23c80 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20   if( nRowEst==0 
23c90 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
23ca0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52  or==OE_None ) nR
23cb0 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  owEst = 1;.  }el
23cc0 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d  se{.    iCol = -
23cd0 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d  1;.    nRowEst =
23ce0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20   0;.  }.  pTerm 
23cf0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
23d00 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
23d10 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
23d20 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
23d50 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  e);.  saved_nEq 
23d60 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
23d70 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b  nEq;.  saved_nSk
23d80 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ip = pNew->u.btr
23d90 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  ee.nSkip;.  save
23da0 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
23db0 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
23dc0 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
23dd0 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
23de0 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
23df0 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
23e00 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
23e10 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
23e20 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69  up = 0;.  rLogSi
23e30 7a 65 20 3d 20 65 73 74 4c 6f 67 28 73 71 6c 69  ze = estLog(sqli
23e40 74 65 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65  te3LogEst(pProbe
23e50 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b  ->aiRowEst[0]));
23e60 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
23e70 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
23e80 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
23e90 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
23ea0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
23eb0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
23ec0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
23ed0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
23ee0 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
23ef0 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
23f00 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
23f10 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
23f20 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
23f30 20 20 54 68 65 20 6d 61 67 69 63 0a 20 20 2a 2a    The magic.  **
23f40 20 6e 75 6d 62 65 72 20 31 38 20 77 61 73 20 66   number 18 was f
23f50 6f 75 6e 64 20 62 79 20 65 78 70 65 72 69 6d 65  ound by experime
23f60 6e 74 61 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ntation to be th
23f70 65 20 70 61 79 6f 66 66 20 70 6f 69 6e 74 20 77  e payoff point w
23f80 68 65 72 65 0a 20 20 2a 2a 20 73 6b 69 70 2d 73  here.  ** skip-s
23f90 63 61 6e 20 62 65 63 6f 6d 65 20 66 61 73 74 65  can become faste
23fa0 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 2d 73 63  r than a full-sc
23fb0 61 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  an..  */.  if( p
23fc0 54 65 72 6d 3d 3d 30 0a 20 20 20 26 26 20 73 61  Term==0.   && sa
23fd0 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
23fe0 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
23ff0 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
24000 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
24010 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 73 61  obe->aiRowEst[sa
24020 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 31 38 20 20  ved_nEq+1]>=18  
24030 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d  /* TUNING: Minim
24040 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  um for skip-scan
24050 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20   */.   && (rc = 
24060 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
24070 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
24080 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49  nLTerm+1))==SQLI
24090 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c  TE_OK.  ){.    L
240a0 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20  ogEst nIter;.   
240b0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
240c0 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Eq++;.    pNew->
240d0 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b  u.btree.nSkip++;
240e0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
240f0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
24100 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
24110 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
24120 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20  E_SKIPSCAN;.    
24130 6e 49 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4c  nIter = sqlite3L
24140 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  ogEst(pProbe->ai
24150 52 6f 77 45 73 74 5b 30 5d 2f 70 50 72 6f 62 65  RowEst[0]/pProbe
24160 2d 3e 61 69 52 6f 77 45 73 74 5b 73 61 76 65 64  ->aiRowEst[saved
24170 5f 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20 70 4e  _nEq+1]);.    pN
24180 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53  ew->rRun = rLogS
24190 69 7a 65 20 2b 20 6e 49 74 65 72 3b 0a 20 20 20  ize + nIter;.   
241a0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
241b0 49 74 65 72 3b 0a 20 20 20 20 77 68 65 72 65 4c  Iter;.    whereL
241c0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
241d0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
241e0 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 29 3b   pProbe, nIter);
241f0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
24200 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
24210 7d 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  }.  for(; rc==SQ
24220 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
24230 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65  !=0; pTerm = whe
24240 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
24250 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20  )){.    int nIn 
24260 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
24270 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
24280 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
24290 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
242a0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
242b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
242c0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
242d0 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  or==WO_ISNULL ||
242e0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
242f0 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
24300 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30  .     && (iCol<0
24310 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e   || pSrc->pTab->
24320 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
24330 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ll).    ){.     
24340 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
24350 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
24360 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
24370 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
24380 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
24390 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
243a0 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
243b0 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
243c0 75 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ue;..    assert(
243d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
243e0 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20  ed_nOut );..    
243f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
24400 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
24410 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
24420 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
24430 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
24440 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
24450 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
24460 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
24470 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
24480 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
24490 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
244a0 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
244b0 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
244c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
244d0 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
244e0 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
244f0 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
24500 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
24510 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f  pNew->rRun = rLo
24520 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69  gSize; /* Baseli
24530 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28  ne cost is log2(
24540 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73  N).  Adjustments
24550 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66   below */.    if
24560 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24570 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
24580 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
24590 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
245a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
245b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
245c0 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
245d0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
245e0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
245f0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
24600 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
24610 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
24620 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
24630 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
24640 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
24650 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
24660 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
24670 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
24680 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
24690 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
246a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
246b0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
246c0 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
246d0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
246e0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
246f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
24700 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
24710 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
24720 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
24730 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
24740 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
24750 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
24760 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24780 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28   changes "x IN (
24790 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20  ?)" into "x=?". 
247a0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
247b0 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20  Run += nIn;.    
247c0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
247d0 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
247e0 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
247f0 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
24800 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
24810 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24820 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20   & (WO_EQ) ){.  
24830 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20      assert(.    
24840 20 20 20 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61      (pNew->wsFla
24850 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
24860 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f  MN_NULL|WHERE_CO
24870 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 53 4b  LUMN_IN|WHERE_SK
24880 49 50 53 43 41 4e 29 29 21 3d 30 0a 20 20 20 20  IPSCAN))!=0.    
24890 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30      || nInMul==0
248a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
248b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
248c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
248d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
248e0 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30  <0 || (nInMul==0
248f0 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
24900 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq==pProbe->n
24910 4b 65 79 43 6f 6c 2d 31 29 29 7b 0a 20 20 20 20  KeyCol-1)){.    
24920 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65      assert( (pNe
24930 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
24940 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
24950 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20   || iCol<0 );.  
24960 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
24970 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45  0 && pProbe->onE
24980 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror==OE_None ){
24990 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
249a0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
249b0 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20  E_UNQ_WANTED;.  
249c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
249d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
249e0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
249f0 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EROW;.        }.
24a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
24a10 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
24a20 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  +;.      pNew->n
24a30 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
24a40 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73  nInMul;.    }els
24a50 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
24a60 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
24a70 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 70 4e  ULL) ){.      pN
24a80 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
24a90 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
24aa0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
24ab0 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
24ac0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53     /* TUNING: IS
24ad0 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20 32 20   NULL selects 2 
24ae0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49  rows */.      nI
24af0 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28  n = 10;  assert(
24b00 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
24b10 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70  st(2) );.      p
24b20 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
24b30 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e  Est + nInMul + n
24b40 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  In;.    }else if
24b50 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24b60 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  or & (WO_GT|WO_G
24b70 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
24b80 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
24b90 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29  erator & WO_GT )
24ba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24bb0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24bc0 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
24bd0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
24be0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
24bf0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54  N_RANGE|WHERE_BT
24c00 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  M_LIMIT;.      p
24c10 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Btm = pTerm;.   
24c20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20     pTop = 0;.   
24c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
24c40 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
24c50 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
24c60 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20  WO_LE) );.      
24c70 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24c80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24c90 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
24ca0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
24cb0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
24cc0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
24cd0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
24ce0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
24cf0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
24d00 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
24d10 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
24d20 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
24d30 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
24d40 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
24d50 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
24d60 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
24d70 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
24d80 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  }.    if( pNew->
24d90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24da0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
24db0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
24dc0 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f  nOut and rRun fo
24dd0 72 20 53 54 41 54 33 20 72 61 6e 67 65 20 76 61  r STAT3 range va
24de0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73  lues */.      as
24df0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
24e00 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
24e10 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
24e20 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
24e30 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20  pBuilder, pBtm, 
24e40 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  pTop, pNew);.   
24e50 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
24e60 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
24e70 5f 53 54 41 54 34 0a 20 20 20 20 69 66 28 20 6e  _STAT4.    if( n
24e80 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 26  InMul==0 .     &
24e90 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c  & pProbe->nSampl
24ea0 65 20 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  e .     && pNew-
24eb0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
24ec0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
24ed0 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
24ee0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
24ef0 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a   SQLITE_Stat3) .
24f00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 45 78 70      ){.      Exp
24f10 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
24f20 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 74  ->pExpr;.      t
24f30 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
24f40 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
24f50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
24f60 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
24f70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24f80 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24f90 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24fa0 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  EQ );.        te
24fb0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
24fc0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
24fd0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
24fe0 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
24ff0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
25000 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
25010 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a  pRight, &nOut);.
25020 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25030 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
25040 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20  r & WO_IN).     
25050 20 20 20 20 20 20 20 20 26 26 20 20 21 45 78 70          &&  !Exp
25060 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
25070 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
25080 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  )  ){.        rc
25090 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
250a0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
250b0 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
250c0 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
250d0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
250e0 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( nOut==0 || rc=
250f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
25100 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a      if( nOut ){.
25110 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
25120 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
25130 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  st(nOut);.      
25140 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74    if( pNew->nOut
25150 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e  >saved_nOut ) pN
25160 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
25170 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _nOut;.      }. 
25180 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25190 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
251a0 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
251b0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
251c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
251d0 45 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65  Each row involve
251e0 73 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20  s a step of the 
251f0 69 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69  index, then a bi
25200 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20  nary search of. 
25210 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e       ** the main
25220 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
25230 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 73 71  pNew->rRun =  sq
25240 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
25250 4e 65 77 2d 3e 72 52 75 6e 2c 72 4c 6f 67 53 69  New->rRun,rLogSi
25260 7a 65 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65  ze>27 ? rLogSize
25270 2d 31 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d  -17 : 10);.    }
25280 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73  .    /* Step cos
25290 74 20 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75  t for each outpu
252a0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65  t row */.    pNe
252b0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
252c0 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
252d0 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
252e0 74 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  t);.    whereLoo
252f0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42  pOutputAdjust(pB
25300 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65  uilder->pWC, pNe
25310 77 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  w);.    rc = whe
25320 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
25330 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
25340 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
25350 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
25360 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
25370 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
25380 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b  .nEq<(pProbe->nK
25390 65 79 43 6f 6c 20 2b 20 28 70 50 72 6f 62 65 2d  eyCol + (pProbe-
253a0 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20  >zName!=0)).    
253b0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
253c0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
253d0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
253e0 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
253f0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
25400 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
25410 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
25420 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
25430 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
25440 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
25450 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
25460 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
25470 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
25480 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
25490 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
254a0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
254b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
254c0 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  p = saved_nSkip;
254d0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
254e0 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
254f0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
25500 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70   saved_nOut;.  p
25510 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
25520 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65  ved_nLTerm;.  re
25530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25540 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
25550 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
25560 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
25570 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
25580 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
25590 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
255a0 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
255b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
255c0 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
255d0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
255e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
255f0 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
25600 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
25610 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
25620 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
25630 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
25640 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
25650 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
25660 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
25670 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
25680 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
25690 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
256a0 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
256b0 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
256c0 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c   *pOB;.  int ii,
256d0 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
256e0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
256f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25700 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
25710 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
25720 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
25730 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
25740 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
25750 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
25760 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
25770 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
25780 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
25790 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
257a0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
257b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
257c0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
257d0 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
257e0 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
257f0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
25800 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
25810 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
25820 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
25830 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
25840 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
25850 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
25860 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25870 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
25880 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
25890 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
258a0 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
258b0 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
258c0 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
258d0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
258e0 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
258f0 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
25900 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
25910 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
25920 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
25930 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
25940 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
25950 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
25960 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
25970 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
25980 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
25990 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
259a0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
259b0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
259c0 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
259d0 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
259e0 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
259f0 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
25a00 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
25a10 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
25a20 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
25a30 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
25a40 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
25a50 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
25a60 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
25a70 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
25a80 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
25a90 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
25aa0 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
25ab0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
25ac0 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
25ad0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
25ae0 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
25af0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
25b00 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Term;.  for(i=0,
25b10 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
25b20 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
25b30 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
25b40 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
25b50 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d  mpliesExpr(pTerm
25b60 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  ->pExpr, pWhere,
25b70 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
25b80 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
25b90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
25ba0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
25bb0 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
25bc0 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
25bd0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
25be0 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
25bf0 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
25c00 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
25c10 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
25c20 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
25c30 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
25c40 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
25c50 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
25c60 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
25c70 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
25c80 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
25c90 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
25ca0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
25cb0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
25cc0 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
25cd0 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
25ce0 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
25cf0 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
25d00 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
25d10 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
25d20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
25d30 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
25d40 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
25d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25d60 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
25d70 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
25d80 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
25d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
25da0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
25db0 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
25dc0 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
25dd0 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
25de0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
25df0 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
25e00 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
25e10 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
25e20 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
25e30 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
25e40 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
25e50 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
25e60 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
25e70 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
25e80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
25e90 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
25ea0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
25eb0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
25ec0 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
25ed0 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
25ee0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
25ef0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
25f00 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
25f10 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
25f20 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
25f30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25f40 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
25f50 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
25f60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
25f70 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
25f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f90 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
25fa0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
25fb0 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
25fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
25fd0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
25fe0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
25ff0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
26000 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
26010 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
26020 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
26030 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
26040 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
26050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26060 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
26070 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
26080 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
26090 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
260a0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
260b0 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
260c0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
260d0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
260e0 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
260f0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
26100 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
26110 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
26120 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
26130 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
26140 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
26150 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
26160 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
26170 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
26180 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
26190 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
261a0 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
261b0 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
261c0 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
261d0 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
261e0 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
261f0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73    }else if( !Has
26200 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
26210 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62     pProbe = pTab
26220 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
26230 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
26240 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
26250 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
26260 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
26270 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
26280 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
26290 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
262a0 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
262b0 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
262c0 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
262d0 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
262e0 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
262f0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
26300 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
26310 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
26320 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
26330 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
26340 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
26350 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
26360 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
26370 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
26380 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
26390 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
263a0 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c  .    sPk.nKeyCol
263b0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
263c0 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
263d0 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
263e0 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
263f0 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
26400 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
26410 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
26420 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 61 69  e = pTab;.    ai
26430 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
26440 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
26450 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
26460 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   1;.    pFirst =
26470 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
26480 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
26490 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
264a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
264b0 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
264c0 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
264d0 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
264e0 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
264f0 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
26500 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
26510 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
26520 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
26530 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
26540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
26550 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20  be = &sPk;.  }. 
26560 20 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33   rSize = sqlite3
26570 4c 6f 67 45 73 74 28 70 54 61 62 2d 3e 6e 52 6f  LogEst(pTab->nRo
26580 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a  wEst);.  rLogSiz
26590 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
265a0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
265b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
265c0 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
265d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
265e0 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
265f0 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20  r->pOrSet.   && 
26600 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
26610 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
26620 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
26630 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
26640 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70  ndex==0.   && !p
26650 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  Src->viaCoroutin
26660 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e  e.   && !pSrc->n
26670 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20  otIndexed.   && 
26680 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
26690 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f    && !pSrc->isCo
266a0 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20 21  rrelated.   && !
266b0 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69 76  pSrc->isRecursiv
266c0 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  e.  ){.    /* Ge
266d0 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
266e0 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
266f0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
26700 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
26710 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
26720 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
26730 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
26740 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
26750 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
26760 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
26770 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
26780 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
26790 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
267a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
267b0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
267c0 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
267d0 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
267e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
267f0 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
26800 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26810 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20  nSkip = 0;.     
26820 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
26830 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
26840 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
26850 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
26860 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
26870 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
26880 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
26890 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
268a0 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
268b0 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
268c0 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69        ** approxi
268d0 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28  mately 7*N*log2(
268e0 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
268f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
26900 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
26910 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
26920 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20  ndexed. */.     
26930 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
26940 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
26950 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74  ze + 28;  assert
26960 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 28==sqlite3Log
26970 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  Est(7) );.      
26980 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
26990 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
269a0 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
269b0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
269c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
269d0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
269e0 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
269f0 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
26a00 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
26a10 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
26a20 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
26a30 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
26a40 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
26a50 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
26a60 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
26a70 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
26a80 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
26a90 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
26aa0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
26ab0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
26ac0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
26ad0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
26ae0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
26af0 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
26b00 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
26b10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
26b20 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
26b30 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
26b40 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
26b50 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
26b60 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
26b70 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
26b80 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
26b90 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
26ba0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
26bb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26bc0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
26bd0 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  NDEX */..  /* Lo
26be0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
26bf0 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
26c00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26c10 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
26c20 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
26c30 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
26c40 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
26c50 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
26c60 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
26c70 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
26c80 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20  New->iTab, pWC, 
26c90 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
26ca0 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
26cb0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
26cc0 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
26cd0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
26ce0 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
26cf0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  }.    pNew->u.bt
26d00 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
26d10 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
26d20 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
26d30 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
26d40 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
26d50 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
26d60 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
26d70 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
26d80 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
26d90 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
26da0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
26db0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
26dc0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
26dd0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
26de0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
26df0 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
26e00 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
26e10 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
26e20 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
26e30 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
26e40 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
26e50 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
26e60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
26e70 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
26e80 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
26e90 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
26ea0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
26eb0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
26ec0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
26ed0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
26ee0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
26ef0 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
26f00 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
26f10 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
26f20 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
26f30 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
26f40 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
26f50 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
26f60 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20  le scan is 3*(N 
26f70 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20  + log2(N))..    
26f80 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74    **  +  The ext
26f90 72 61 20 33 20 66 61 63 74 6f 72 20 69 73 20 74  ra 3 factor is t
26fa0 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20  o encourage the 
26fb0 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c  use of indexed l
26fc0 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20  ookups.      ** 
26fd0 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63      over full sc
26fe0 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a 20  ans.  FIXME */. 
26ff0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
27000 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
27010 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
27020 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77  e) + 16;.      w
27030 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
27040 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b  just(pWC, pNew);
27050 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
27060 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
27070 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
27080 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
27090 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
270a0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
270b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
270c0 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
270d0 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
270e0 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
270f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
27100 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
27110 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
27120 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
27130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27140 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
27150 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
27160 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
27170 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
27180 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
27190 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
271a0 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
271b0 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
271c0 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  D;.      }..    
271d0 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
271e0 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
271f0 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
27200 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  | !HasRowid(pTab
27210 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d  ).       || ( m=
27220 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
27230 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
27240 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  d==0.         &&
27250 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52   (pProbe->szIdxR
27260 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
27270 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  w).         && (
27280 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27290 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
272a0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
272b0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
272c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
272d0 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20  UseCis.         
272e0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
272f0 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70  nabled(pWInfo->p
27300 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
27310 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
27320 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
27330 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65    ){.        pNe
27340 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
27350 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
27360 20 20 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30          if( m==0
27370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
27380 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
27390 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
273a0 78 20 73 63 61 6e 20 69 73 20 4b 2a 28 4e 20 2b  x scan is K*(N +
273b0 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20   log2(N))..     
273c0 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
273d0 65 78 74 72 61 20 66 61 63 74 6f 72 20 4b 20 6f  extra factor K o
273e0 66 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  f between 1.1 an
273f0 64 20 33 2e 30 20 74 68 61 74 20 64 65 70 65 6e  d 3.0 that depen
27400 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ds.          ** 
27410 20 20 20 20 6f 6e 20 74 68 65 20 72 65 6c 61 74      on the relat
27420 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65  ive sizes of the
27430 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 69   table and the i
27440 6e 64 65 78 2e 20 20 4b 0a 20 20 20 20 20 20 20  ndex.  K.       
27450 20 20 20 2a 2a 20 20 20 20 20 69 73 20 73 6d 61     **     is sma
27460 6c 6c 65 72 20 66 6f 72 20 73 6d 61 6c 6c 65 72  ller for smaller
27470 20 69 6e 64 69 63 65 73 2c 20 74 68 75 73 20 66   indices, thus f
27480 61 76 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 20 20  avoring them..  
27490 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
274a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
274b0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
274c0 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
274d0 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
27500 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
27510 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  abRow;.        }
27520 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27530 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
27540 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f  of scanning a no
27550 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
27560 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e   is (N+1)*log2(N
27570 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  ).          ** w
27580 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d  hich we will sim
27590 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a  plify to just N*
275a0 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20  log2(N) */.     
275b0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
275c0 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69  = rSize + rLogSi
275d0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
275e0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
275f0 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
27600 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
27610 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
27620 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
27630 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
27640 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
27650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
27660 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27670 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
27680 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
27690 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
276a0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
276b0 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
276c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
276d0 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
276e0 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
276f0 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
27700 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
27710 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
27720 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
27730 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
27740 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
27750 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
27760 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
27770 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
27780 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
27790 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
277a0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
277b0 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
277c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
277d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
277e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
277f0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
27800 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
27810 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
27820 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
27830 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
27840 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
27850 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
27860 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
27870 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
27880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
27890 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
278a0 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
278b0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
278c0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
278d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
278e0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
278f0 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  a.){.  WhereInfo
27900 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
27910 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
27920 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
27930 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27950 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
27960 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
27970 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
27980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27990 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
279a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
279b0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
279c0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
279d0 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
279e0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
279f0 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
27a00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
27a10 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
27a20 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
27a30 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
27a40 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
27a50 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
27a60 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
27a70 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
27a80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
27a90 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
27aa0 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
27ab0 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  erm;.  int nCons
27ac0 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65  traint;.  int se
27ad0 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  enIn = 0;       
27ae0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
27af0 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
27b00 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
27b10 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20  t seenVar = 0;  
27b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27b30 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73  ue if a non-cons
27b40 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  tant constraint 
27b50 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
27b60 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20   iPhase;        
27b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
27b80 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a  const w/o IN, 1:
27b90 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e   const, 2: no IN
27ba0 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68  ,  2: IN */.  Wh
27bb0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
27bc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27bd0 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  _OK;..  pWInfo =
27be0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
27bf0 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
27c00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
27c10 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
27c20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
27c30 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
27c40 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
27c50 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
27c60 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
27c70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54  New->iTab];.  pT
27c80 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
27c90 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
27ca0 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
27cb0 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
27cc0 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
27cd0 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
27ce0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
27cf0 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
27d00 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
27d10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27d20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
27d30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
27d40 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
27d50 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
27d60 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
27d70 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
27d80 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
27d90 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
27da0 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
27db0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
27dc0 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
27dd0 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
27de0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
27df0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
27e00 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
27e10 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73  traint) ){.    s
27e20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
27e30 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
27e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27e50 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  MEM;.  }..  for(
27e60 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65  iPhase=0; iPhase
27e70 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a  <=3; iPhase++){.
27e80 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20      if( !seenIn 
27e90 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30  && (iPhase&1)!=0
27ea0 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65   ){.      iPhase
27eb0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ++;.      if( iP
27ec0 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a  hase>3 ) break;.
27ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
27ee0 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65  eenVar && iPhase
27ef0 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
27f00 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
27f10 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
27f20 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
27f30 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
27f40 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
27f50 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
27f60 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
27f70 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
27f80 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
27f90 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
27fa0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
27fb0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
27fc0 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29  switch( iPhase )
27fd0 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
27fe0 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
27ff0 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65  s without IN ope
28000 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
28010 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
28020 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
28030 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
28040 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
28050 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28060 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a      seenIn = 1;.
28070 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28080 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
28090 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
280a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
280b0 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
280c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
280d0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
280e0 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
280f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
28100 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
28110 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
28120 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
28130 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
28140 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
28150 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
28160 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
28170 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
28180 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
28190 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
281a0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
281b0 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t==0);.         
281c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
281d0 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61  case 2:    /* Va
281e0 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20  riables without 
281f0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
28200 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
28210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
28220 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
28230 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
28240 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20  r & WO_IN)==0;. 
28250 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
28260 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
28270 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
28280 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20  with IN */.     
28290 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
282a0 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29  nVar && seenIn )
282b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
282c0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
282d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
282e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
282f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61  .    memset(pUsa
28300 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
28310 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
28320 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
28330 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
28340 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
28350 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
28360 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
28370 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e  Str);.    pIdxIn
28380 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
28390 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
283a0 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49  xNum = 0;.    pI
283b0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
283c0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
283d0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
283e0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
283f0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
28400 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
28410 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
28420 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70  (double)2;.    p
28430 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
28440 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20  edRows = 25;.   
28450 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
28460 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
28470 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
28480 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
28490 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
284a0 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f  exit;.    pIdxCo
284b0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
284c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
284d0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
284e0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
284f0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
28500 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
28510 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20  mxTerm = -1;.   
28520 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
28530 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69  LSlot>=nConstrai
28540 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt );.    for(i=
28550 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
28560 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
28570 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  erm[i] = 0;.    
28580 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
28590 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66  tMask = 0;.    f
285a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
285b0 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
285c0 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Cons++){.      i
285d0 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61  f( (iTerm = pUsa
285e0 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
285f0 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  - 1)>=0 ){.     
28600 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
28610 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
28620 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
28630 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
28640 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
28650 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
28660 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  >nTerm.         
28670 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
28680 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
28690 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
286a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
286b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
286c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
286d0 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
286e0 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
286f0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
28700 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
28710 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
28720 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
28730 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
28740 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74  e( iTerm==nConst
28750 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20  raint-1 );.     
28760 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
28770 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
28780 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e  tcase( j==pWC->n
28790 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20  Term-1 );.      
287a0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
287b0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  a[j];.        pN
287c0 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
287d0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
287e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
287f0 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
28800 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Slot );.        
28810 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
28820 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
28830 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
28840 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
28850 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
28860 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
28870 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74  =15 );.        t
28880 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
28890 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  16 );.        if
288a0 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55  ( iTerm<16 && pU
288b0 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70  sage[i].omit ) p
288c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
288d0 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d  Mask |= 1<<iTerm
288e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
288f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28900 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
28910 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73           if( pUs
28920 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29  age[i].omit==0 )
28930 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
28940 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
28950 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e  to use an IN con
28960 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76  straint if the v
28970 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
28980 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73           ** says
28990 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61   that the equiva
289a0 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69  lent EQ constrai
289b0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66  nt cannot be saf
289c0 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20  ely omitted..   
289d0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77           ** If w
289e0 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e do attempt to 
289f0 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74  use such a const
28a00 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73  raint, some rows
28a10 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
28a20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65        ** repeate
28a30 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e  d in the output.
28a40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28a50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
28a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
28a70 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
28a80 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
28a90 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61  ned by an IN cla
28aa0 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  use may not.    
28ab0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
28ac0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
28ad0 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
28ae0 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
28af0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20   terms.         
28b00 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
28b10 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
28b20 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
28b30 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
28b40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29            ** (2)
28b50 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
28b60 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
28b70 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
28b80 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
28b90 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20    ** together.  
28ba0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
28bb0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
28bc0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
28bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28be0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e    }.    if( i>=n
28bf0 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
28c00 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
28c10 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20   = mxTerm+1;.   
28c20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
28c30 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
28c40 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
28c50 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  New->u.vtab.idxN
28c60 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  um = pIdxInfo->i
28c70 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65  dxNum;.      pNe
28c80 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
28c90 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ee = pIdxInfo->n
28ca0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b  eedToFreeIdxStr;
28cb0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
28cc0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
28cd0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  r = 0;.      pNe
28ce0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
28cf0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
28d00 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Str;.      pNew-
28d10 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
28d20 64 20 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e  d = (u8)((pIdxIn
28d30 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29  fo->nOrderBy!=0)
28d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d60 20 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66        && pIdxInf
28d70 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
28d80 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ed);.      pNew-
28d90 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
28da0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
28db0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f  sqlite3LogEstFro
28dc0 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
28dd0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
28de0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
28df0 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
28e00 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  st(pIdxInfo->est
28e10 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20  imatedRows);.   
28e20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65     whereLoopInse
28e30 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
28e40 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  w);.      if( pN
28e50 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
28e60 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ree ){.        s
28e70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
28e80 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
28e90 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28ea0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
28eb0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
28ec0 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c   }.  }  ..whereL
28ed0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a  oopAddVtab_exit:
28ee0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
28ef0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
28f00 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
28f10 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
28f20 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
28f30 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
28f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28f50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
28f60 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
28f70 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ABLE */../*.** A
28f80 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  dd WhereLoop ent
28f90 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f  ries to handle O
28fa0 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77  R terms.  This w
28fb0 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a  orks for either.
28fc0 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72  ** btrees or vir
28fd0 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  tual tables..*/.
28fe0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
28ff0 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c  LoopAddOr(WhereL
29000 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
29010 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45  lder, Bitmask mE
29020 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e  xtra){.  WhereIn
29030 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
29040 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
29050 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
29060 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  C;.  WhereLoop *
29070 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72  pNew;.  WhereTer
29080 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e  m *pTerm, *pWCEn
29090 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
290a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
290b0 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
290c0 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65  se tempWC;.  Whe
290d0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53  reLoopBuilder sS
290e0 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65  ubBuild;.  Where
290f0 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72  OrSet sSum, sCur
29100 2c 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75 63  , sPrev;.  struc
29110 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
29120 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20  pItem;.  .  pWC 
29130 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
29140 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
29150 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29160 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74  E_AND_ONLY ) ret
29170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29180 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61   pWCEnd = pWC->a
29190 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
291a0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
291b0 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74  ->pNew;.  memset
291c0 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&sSum, 0, sizeo
291d0 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65  f(sSum));.  pIte
291e0 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
291f0 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
29200 69 54 61 62 3b 0a 20 20 69 66 28 20 21 48 61 73  iTab;.  if( !Has
29210 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61  Rowid(pItem->pTa
29220 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
29230 54 45 5f 4f 4b 3b 0a 20 20 69 43 75 72 20 3d 20  TE_OK;.  iCur = 
29240 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
29250 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
29260 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
29270 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
29280 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
29290 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
292a0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
292b0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
292c0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
292d0 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
292e0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
292f0 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
29300 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
29310 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
29320 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
29330 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
29340 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
29350 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
29360 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
29370 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
29380 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
29390 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
293a0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
293b0 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
293c0 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
293d0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
293e0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
293f0 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
29400 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
29410 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
29420 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
29430 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
29440 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
29450 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
29460 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
29470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
29480 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
29490 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
294a0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
294b0 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
294c0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
294d0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
294e0 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
294f0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
29500 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
29510 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
29520 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
29530 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
29540 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
29550 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
29560 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
29570 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
29580 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
29590 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
295a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
295b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
295c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
295d0 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  r.n = 0;.#ifndef
295e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
295f0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
29600 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
29610 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
29620 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
29630 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
29640 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  al(&sSubBuild, m
29650 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20  Extra);.        
29660 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
29670 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
29680 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
29690 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
296a0 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
296b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
296c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
296d0 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d  E_OK || sCur.n==
296e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
296f0 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20   sCur.n==0 ){.  
29700 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
29710 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
29720 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
29730 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  se if( once ){. 
29740 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
29750 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75  Move(&sSum, &sCu
29760 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  r);.          on
29770 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
29780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29790 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50   whereOrMove(&sP
297a0 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20  rev, &sSum);.   
297b0 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
297c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
297d0 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b  (i=0; i<sPrev.n;
297e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
297f0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43     for(j=0; j<sC
29800 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ur.n; j++){.    
29810 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
29820 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73  rInsert(&sSum, s
29830 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71  Prev.a[i].prereq
29840 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65   | sCur.a[j].pre
29850 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  req,.           
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
29880 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75  d(sPrev.a[i].rRu
29890 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75  n, sCur.a[j].rRu
298a0 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298c0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
298d0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74  (sPrev.a[i].nOut
298e0 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74  , sCur.a[j].nOut
298f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
29900 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
29910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29920 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
29930 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e  rm = 1;.      pN
29940 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
29950 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65  pTerm;.      pNe
29960 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
29970 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
29980 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
29990 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
299a0 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
299b0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65       memset(&pNe
299c0 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  w->u, 0, sizeof(
299d0 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20  pNew->u));.     
299e0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
299f0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75  LITE_OK && i<sSu
29a00 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m.n; i++){.     
29a10 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75     /* TUNING: Mu
29a20 6c 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f  ltiple by 3.5 fo
29a30 72 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20  r the secondary 
29a40 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a  table lookup */.
29a50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
29a60 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
29a70 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20  Run + 18;.      
29a80 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
29a90 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
29aa0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
29ab0 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
29ac0 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
29ad0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
29ae0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
29af0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
29b00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29b10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
29b20 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
29b30 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
29b40 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
29b50 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
29b60 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
29b70 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
29b80 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
29b90 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
29ba0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
29bb0 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b  mask mExtra = 0;
29bc0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
29bd0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
29be0 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
29bf0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
29c00 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
29c10 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
29c20 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
29c30 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
29c40 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
29c50 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57  nt nTabList = pW
29c60 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
29c70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29c80 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  OK;.  u8 priorJo
29c90 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68  inType = 0;.  Wh
29ca0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a  ereLoop *pNew;..
29cb0 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
29cc0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
29cd0 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
29ce0 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
29cf0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
29d00 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
29d10 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
29d20 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
29d30 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54  =pTabList->a; iT
29d40 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61  ab<nTabList; iTa
29d50 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
29d60 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
29d70 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
29d80 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
29d90 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
29da0 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
29db0 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
29dc0 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pItem->jointype
29dd0 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20  |priorJoinType) 
29de0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
29df0 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
29e00 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
29e10 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
29e20 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74  orJoinType = pIt
29e30 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
29e40 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
29e50 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
29e60 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29e70 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
29e80 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
29e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29ea0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
29eb0 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64  pAddBtree(pBuild
29ec0 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
29ed0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
29ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29ef0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
29f00 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20  AddOr(pBuilder, 
29f10 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
29f20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65     mPrior |= pNe
29f30 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
29f40 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d   if( rc || db->m
29f50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
29f60 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65  eak;.  }.  where
29f70 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e  LoopClear(db, pN
29f80 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ew);.  return rc
29f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69  ;.}../*.** Exami
29fa0 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28  ne a WherePath (
29fb0 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
29fc0 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57  n of the extra W
29fd0 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20  hereLoop of the 
29fe0 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  5th.** parameter
29ff0 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  s) to see if it 
2a000 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
2a010 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52  the requested OR
2a020 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52  DER BY.** (or GR
2a030 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20  OUP BY) without 
2a040 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61  requiring a sepa
2a050 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74  rate sort operat
2a060 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a  ion.  Return:.**
2a070 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45   .**    0:  ORDE
2a080 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69  R BY is not sati
2a090 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20  sfied.  Sorting 
2a0a0 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31  required.**    1
2a0b0 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 73  :  ORDER BY is s
2a0c0 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f  atisfied.      O
2a0d0 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20  mit sorting.**  
2a0e0 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74   -1:  Unknown at
2a0f0 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   this time.**.**
2a100 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65   Note that proce
2a110 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f  ssing for WHERE_
2a120 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52  GROUPBY and WHER
2a130 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20  E_DISTINCTBY is 
2a140 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74  not as.** strict
2a150 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59  .  With GROUP BY
2a160 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68   and DISTINCT th
2a170 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65  e only requireme
2a180 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71  nt is that.** eq
2a190 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70  uivalent rows ap
2a1a0 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  pear immediately
2a1b0 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65   adjacent to one
2a1c0 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50   another.  GROUP
2a1d0 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49   BY.** and DISTI
2a1e0 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  NT do not requir
2a1f0 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72  e rows to appear
2a200 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c   in any particul
2a210 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67  ar order as long
2a220 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c 65 6e  .** as equivelen
2a230 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70  t rows are group
2a240 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68  ed together.  Th
2a250 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20  us for GROUP BY 
2a260 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20  and DISTINCT.** 
2a270 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72  the pOrderBy ter
2a280 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  ms can be matche
2a290 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20  d in any order. 
2a2a0 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20   With ORDER BY, 
2a2b0 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79  the .** pOrderBy
2a2c0 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d   terms must be m
2a2d0 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74  atched in strict
2a2e0 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f   left-to-right o
2a2f0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2a300 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61 74  int wherePathSat
2a310 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20  isfiesOrderBy(. 
2a320 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2a330 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48  fo,    /* The WH
2a340 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2a350 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2a360 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42  By,   /* ORDER B
2a370 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  Y or GROUP BY or
2a380 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65   DISTINCT clause
2a390 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57   to check */.  W
2a3a0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
2a3b0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2a3c0 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a  ePath to check *
2a3d0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
2a3e0 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67  gs,       /* Mig
2a3f0 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ht contain WHERE
2a400 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52  _GROUPBY or WHER
2a410 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a  E_DISTINCTBY */.
2a420 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20    u16 nLoop,    
2a430 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a440 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
2a450 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
2a460 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2a470 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64  Last,     /* Add
2a480 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20   this WhereLoop 
2a490 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50  to the end of pP
2a4a0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
2a4b0 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d    Bitmask *pRevM
2a4c0 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  ask     /* OUT: 
2a4d0 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f  Mask of WhereLoo
2a4e0 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76  ps to run in rev
2a4f0 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b  erse order */.){
2a500 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20  .  u8 revSet;   
2a510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a520 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e   if rev is known
2a530 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20   */.  u8 rev;   
2a540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2a550 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72  omposite sort or
2a560 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49  der */.  u8 revI
2a570 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx;            /
2a580 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64  * Index sort ord
2a590 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  er */.  u8 isOrd
2a5a0 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a  erDistinct;   /*
2a5b0 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65   All prior Where
2a5c0 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d  Loops are order-
2a5d0 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38  distinct */.  u8
2a5e0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2a5f0 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
2a600 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51  he loop has UNIQ
2a610 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  UE NOT NULL colu
2a620 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61  mns */.  u8 isMa
2a630 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tch;           /
2a640 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65  * iColumn matche
2a650 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
2a660 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a670 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c  */.  u16 nKeyCol
2a680 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
2a690 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
2a6a0 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f  mns in pIndex */
2a6b0 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
2a6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2a6d0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65  l number of orde
2a6e0 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  red columns in t
2a6f0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31  he index */.  u1
2a700 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  6 nOrderBy;     
2a710 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65      /* Number te
2a720 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
2a730 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2a740 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
2a750 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2a760 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70  f WhereLoop in p
2a770 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65  Path being proce
2a780 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ssed */.  int i,
2a790 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2a7a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2a7b0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2a7d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2a7e0 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   current WhereLo
2a7f0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  op */.  int iCol
2a800 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
2a810 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72   A column number
2a820 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43   within table iC
2a830 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ur */.  WhereLoo
2a840 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a  p *pLoop = 0; /*
2a850 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   Current WhereLo
2a860 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  op being process
2a870 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ed. */.  WhereTe
2a880 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f  rm *pTerm;     /
2a890 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
2a8a0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2a8b0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
2a8c0 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f  OBExpr;        /
2a8d0 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
2a8e0 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
2a8f0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f  Y clause */.  Co
2a900 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
2a910 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66      /* COLLATE f
2a920 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20  unction from an 
2a930 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a940 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20  term */.  Index 
2a950 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
2a960 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73  /* The index ass
2a970 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f  ociated with pLo
2a980 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  op */.  sqlite3 
2a990 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
2a9a0 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
2a9b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a9c0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  n */.  Bitmask o
2a9d0 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  bSat = 0;    /* 
2a9e0 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59  Mask of ORDER BY
2a9f0 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
2aa00 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74   so far */.  Bit
2aa10 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20  mask obDone;    
2aa20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
2aa30 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
2aa40 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72   */.  Bitmask or
2aa50 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b  derDistinctMask;
2aa60 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
2aa70 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f   well-ordered lo
2aa80 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ops */.  Bitmask
2aa90 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20   ready;         
2aaa0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2aab0 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a  inner loops */..
2aac0 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    /*.  ** We say
2aad0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2aae0 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69  s "one-row" if i
2aaf0 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d  t generates no m
2ab00 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a  ore than one.  *
2ab10 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
2ab20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73    A WhereLoop is
2ab30 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20   one-row if all 
2ab40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ab50 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20   are true:.  ** 
2ab60 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63   (a) All index c
2ab70 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74  olumns match wit
2ab80 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  h WHERE_COLUMN_E
2ab90 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65  Q..  **  (b) The
2aba0 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65   index is unique
2abb0 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c  .  ** Any WhereL
2abc0 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52  oop with an WHER
2abd0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73  E_COLUMN_EQ cons
2abe0 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f  traint on the ro
2abf0 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a  wid is one-row..
2ac00 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72    ** Every one-r
2ac10 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c  ow WhereLoop wil
2ac20 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45  l have the WHERE
2ac30 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20  _ONEROW bit set 
2ac40 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a  in wsFlags..  **
2ac50 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
2ac60 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
2ac70 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69  rder-distinct" i
2ac80 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c  f the set of col
2ac90 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  umns from.  ** t
2aca0 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  hat WhereLoop th
2acb0 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52  at are in the OR
2acc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2acd0 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  e different for 
2ace0 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  every.  ** row o
2acf0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  f the WhereLoop.
2ad00 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20    Every one-row 
2ad10 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74  WhereLoop is aut
2ad20 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
2ad30 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
2ad40 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68    A WhereLoop th
2ad50 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  at has no column
2ad60 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2ad70 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73  Y clause.  ** is
2ad80 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69   not order-disti
2ad90 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72  nct. To be order
2ada0 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74  -distinct is not
2adb0 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20   quite the same 
2adc0 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e  as being.  ** UN
2add0 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49  IQUE since a UNI
2ade0 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e  QUE column or in
2adf0 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  dex can have mul
2ae00 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20  tiple rows that 
2ae10 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61  .  ** are NULL a
2ae20 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  nd NULL values a
2ae30 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  re equivalent fo
2ae40 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  r the purpose of
2ae50 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2ae60 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65  .  ** To be orde
2ae70 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20  r-distinct, the 
2ae80 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
2ae90 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
2aea0 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ULL..  **.  ** T
2aeb0 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74  he rowid for a t
2aec0 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55  able is always U
2aed0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2aee0 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74  LL so whenever t
2aef0 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70  he.  ** rowid ap
2af00 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44  pears in the ORD
2af10 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2af20 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2af30 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a  WhereLoop is.  *
2af40 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2af50 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2af60 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
2af70 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a  pOrderBy!=0 );..
2af80 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79    /* Sortability
2af90 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c   of virtual tabl
2afa0 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  es is determined
2afb0 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
2afc0 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f  ex method.  ** o
2afd0 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2afe0 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20  ble itself */.  
2aff0 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61  if( pLast->wsFla
2b000 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2b010 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74  ALTABLE ){.    t
2b020 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30  estcase( nLoop>0
2b030 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65   );  /* True whe
2b040 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72  n outer loops ar
2b050 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61  e one-row and ma
2b060 74 63 68 20 0a 20 20 20 20 20 20 20 20 20 20 20  tch .           
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b080 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65  * no ORDER BY te
2b090 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  rms */.    retur
2b0a0 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e  n pLast->u.vtab.
2b0b0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20  isOrdered;.  }. 
2b0c0 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70   if( nLoop && Op
2b0d0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
2b0e0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72  ed(db, SQLITE_Or
2b0f0 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20  derByIdxJoin) ) 
2b100 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72  return 0;..  nOr
2b110 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
2b120 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63  ->nExpr;.  testc
2b130 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42  ase( nOrderBy==B
2b140 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f  MS-1 );.  if( nO
2b150 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72  rderBy>BMS-1 ) r
2b160 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e  eturn 0;  /* Can
2b170 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65  not optimize ove
2b180 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20  rly large ORDER 
2b190 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72  BYs */.  isOrder
2b1a0 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
2b1b0 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54  obDone = MASKBIT
2b1c0 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20  (nOrderBy)-1;.  
2b1d0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2b1e0 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d  k = 0;.  ready =
2b1f0 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   0;.  for(iLoop=
2b200 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  0; isOrderDistin
2b210 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f  ct && obSat<obDo
2b220 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f  ne && iLoop<=nLo
2b230 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2b240 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20    if( iLoop>0 ) 
2b250 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  ready |= pLoop->
2b260 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c  maskSelf;.    pL
2b270 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  oop = iLoop<nLoo
2b280 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p ? pPath->aLoop
2b290 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b  [iLoop] : pLast;
2b2a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
2b2b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2b2c0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b2d0 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75  E)==0 );.    iCu
2b2e0 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
2b2f0 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
2b300 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20  Tab].iCursor;.. 
2b310 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
2b320 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ny ORDER BY term
2b330 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c   X that is a col
2b340 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
2b350 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
2b360 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20  urrent loop for 
2b370 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74  which there is t
2b380 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
2b390 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f  .    ** clause o
2b3a0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20  f the form X IS 
2b3b0 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74  NULL or X=? that
2b3c0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
2b3d0 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f  outer.    ** loo
2b3e0 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ps..    */.    f
2b3f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
2b400 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2b410 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2b420 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2b430 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72  e;.      pOBExpr
2b440 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2b450 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
2b460 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2b470 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2b480 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
2b490 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
2b4a0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2b4b0 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
2b4c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2b4d0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
2b4e0 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69  (&pWInfo->sWC, i
2b4f0 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43  Cur, pOBExpr->iC
2b500 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72                ~r
2b520 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
2b530 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20  SNULL, 0);.     
2b540 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
2b550 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2b560 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2b570 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
2b580 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
2b590 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
2b5a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
2b5b0 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70  , *z2;.        p
2b5c0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2b5d0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2b5e0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
2b5f0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2b600 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
2b610 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2b620 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2b630 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d       z1 = pColl-
2b640 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2b650 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2b660 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2b670 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d  o->pParse, pTerm
2b680 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2b690 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2b6a0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2b6b0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32  Coll;.        z2
2b6c0 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
2b6d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2b6e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
2b6f0 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  z2)!=0 ) continu
2b700 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2b710 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2b720 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  T(i);.    }..   
2b730 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2b740 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2b750 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
2b760 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2b770 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
2b780 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
2b790 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
2b7a0 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  KeyCol = 0;.    
2b7b0 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b      nColumn = 1;
2b7c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2b7d0 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
2b7e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2b7f0 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
2b800 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
2b810 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2b820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b830 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70       nKeyCol = p
2b840 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  Index->nKeyCol;.
2b850 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2b860 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
2b870 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
2b880 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79  t( nColumn==nKey
2b890 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77  Col+1 || !HasRow
2b8a0 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
2b8b0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  e) );.        as
2b8c0 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69  sert( pIndex->ai
2b8d0 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31  Column[nColumn-1
2b8e0 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52  ]==(-1) || !HasR
2b8f0 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
2b900 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ble));.        i
2b910 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2b920 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
2b930 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20  !=OE_None;.     
2b940 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   }..      /* Loo
2b950 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
2b960 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
2b970 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68  ex and deal with
2b980 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20   the ones.      
2b990 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2b9a0 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
2b9b0 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a  = or IN..      *
2b9c0 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65  /.      rev = re
2b9d0 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vSet = 0;.      
2b9e0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
2b9f0 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
2ba00 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a  =0; j<nColumn; j
2ba10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
2ba20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65  bOnce;   /* True
2ba30 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
2ba40 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
2ba50 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
2ba60 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
2ba70 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a   IS NULL terms *
2ba80 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  /.        if( j<
2ba90 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2baa0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2bab0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
2bac0 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
2bad0 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
2bae0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
2baf0 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
2bb00 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
2bb10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bb20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
2bb30 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2bb40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2bb50 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
2bb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
2bb70 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2bb80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bb90 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2bba0 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
2bbb0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
2bbc0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
2bbd0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
2bbe0 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
2bbf0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
2bc00 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
2bc10 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
2bc20 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
2bc30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2bc40 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
2bc50 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
2bc60 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
2bc70 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
2bc80 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
2bc90 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
2bca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2bcb0 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
2bcc0 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
2bcd0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2bce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bcf0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2bd00 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
2bd10 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
2bd20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2bd30 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
2bd40 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
2bd50 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
2bd60 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
2bd70 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
2bd80 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
2bd90 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
2bda0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
2bdb0 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
2bdc0 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
2bdd0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
2bde0 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
2bdf0 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
2be00 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2be10 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
2be20 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
2be30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
2be40 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2be50 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2be60 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
2be70 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
2be80 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
2be90 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
2bea0 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
2beb0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2bec0 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52  and mark that OR
2bed0 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20  DER BY term off 
2bee0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2bef0 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20      bOnce = 1;. 
2bf00 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
2bf10 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
2bf20 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c  i=0; bOnce && i<
2bf30 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2bf40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41            if( MA
2bf50 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2bf60 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bf70 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d         pOBExpr =
2bf80 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2bf90 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
2bfa0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2bfb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2bfc0 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
2bfd0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
2bfe0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2bff0 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
2c000 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2c010 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
2c020 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2c030 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59  & (WHERE_GROUPBY
2c040 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42  |WHERE_DISTINCTB
2c050 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d  Y))==0 ) bOnce =
2c060 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2c070 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
2c080 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
2c090 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2c0a0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
2c0b0 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
2c0c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2c0d0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  f( pOBExpr->iCol
2c0e0 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63  umn!=iColumn ) c
2c0f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c100 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
2c110 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c120 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2c130 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2c140 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2c150 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2c160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2c170 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2c180 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2c190 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
2c1a0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2c1b0 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
2c1c0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  pIndex->azColl[j
2c1d0 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ])!=0 ) continue
2c1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c1f0 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
2c200 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2c210 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2c220 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
2c230 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
2c240 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
2c250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2c260 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74  stcase( distinct
2c270 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20  Columns==0 );.  
2c280 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
2c290 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20  ctColumns = 1;. 
2c2a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c2b0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2c2c0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
2c2d0 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
2c2e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2c2f0 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20  ERE_GROUPBY)==0 
2c300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2c310 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
2c320 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f  sort order is co
2c330 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f  mpatible in an O
2c340 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
2c350 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53              ** S
2c360 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72  ort order is irr
2c370 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52  elevant for a GR
2c380 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a  OUP BY clause. *
2c390 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2c3a0 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20  ( revSet ){.    
2c3b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
2c3c0 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f  ev ^ revIdx)!=pO
2c3d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
2c3e0 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20  tOrder ) return 
2c3f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
2c400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c410 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
2c420 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
2c430 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
2c440 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2c450 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c  ev ) *pRevMask |
2c460 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29  = MASKBIT(iLoop)
2c470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c480 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  revSet = 1;.    
2c490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c4a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2c4b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2c4c0 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64  * No match found
2c4d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2c4e0 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79  ( j==0 || j<nKey
2c4f0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
2c500 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2c510 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20  rderDistinct!=0 
2c520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2c530 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2c540 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
2c550 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2c560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c570 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f   } /* end Loop o
2c580 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f  ver all index co
2c590 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69  lumns */.      i
2c5a0 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  f( distinctColum
2c5b0 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ns ){.        te
2c5c0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2c5d0 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
2c5e0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2c5f0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20  tinct = 1;.     
2c600 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d   }.    } /* end-
2c610 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a  if not one-row *
2c620 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  /..    /* Mark o
2c630 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44  ff any other ORD
2c640 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
2c650 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70   reference pLoop
2c660 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72   */.    if( isOr
2c670 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
2c680 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e       orderDistin
2c690 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d  ctMask |= pLoop-
2c6a0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
2c6b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2c6c0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2c6d0 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
2c6e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65       Bitmask mTe
2c6f0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2c700 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
2c710 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
2c720 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65         p = pOrde
2c730 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
2c740 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d  .        mTerm =
2c750 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2c760 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2c770 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t,p);.        if
2c780 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73  ( mTerm==0 && !s
2c790 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
2c7a0 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e  tant(p) ) contin
2c7b0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
2c7c0 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73  (mTerm&~orderDis
2c7d0 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b  tinctMask)==0 ){
2c7e0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
2c7f0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
2c800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c810 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  }.    }.  } /* E
2c820 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72  nd the loop over
2c830 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20   all WhereLoops 
2c840 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20  from outer-most 
2c850 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f  down to inner-mo
2c860 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61  st */.  if( obSa
2c870 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75  t==obDone ) retu
2c880 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f  rn 1;.  if( !isO
2c890 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 20 72  rderDistinct ) r
2c8a0 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2c8b0 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n -1;.}..#ifdef 
2c8c0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2c8d0 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67  ED./* For debugg
2c8e0 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f  ing use only: */
2c8f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2c900 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d  ar *wherePathNam
2c910 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61  e(WherePath *pPa
2c920 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57  th, int nLoop, W
2c930 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29  hereLoop *pLast)
2c940 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
2c950 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74  zName[65];.  int
2c960 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2c970 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e  <nLoop; i++){ zN
2c980 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e  ame[i] = pPath->
2c990 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d  aLoop[i]->cId; }
2c9a0 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a  .  if( pLast ) z
2c9b0 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73  Name[i++] = pLas
2c9c0 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b  t->cId;.  zName[
2c9d0 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
2c9e0 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
2c9f0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
2ca00 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
2ca10 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20  Loop objects at 
2ca20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
2ca30 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2ca40 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
2ca50 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
2ca60 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
2ca70 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
2ca80 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
2ca90 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
2caa0 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
2cab0 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
2cac0 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73  fields..**.** As
2cad0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f  sume that the to
2cae0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  tal number of ou
2caf0 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77  tput rows that w
2cb00 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
2cb10 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  orted.** will be
2cb20 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65   nRowEst (in the
2cb30 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65   10*log2 represe
2cb40 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69  ntation).  Or, i
2cb50 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a  gnore sorting.**
2cb60 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73   costs if nRowEs
2cb70 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  t==0..**.** Retu
2cb80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
2cb90 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54  success or SQLIT
2cba0 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d  E_NOMEM of a mem
2cbb0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
2cbc0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
2cbd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2cbe0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68  erePathSolver(Wh
2cbf0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
2cc00 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29   LogEst nRowEst)
2cc10 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
2cc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2cc30 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2cc40 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
2cc50 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
2cc60 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cc80 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
2cc90 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
2cca0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
2ccb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2ccc0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2ccd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ccf0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2cd00 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
2cd10 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
2cd20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2cd30 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
2cd40 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
2cd50 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
2cd60 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2cd70 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2cd80 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d  s */.  int mxI =
2cd90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2cda0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
2cdb0 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61  t entry to repla
2cdc0 63 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ce */.  LogEst r
2cdd0 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
2cde0 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70    /* Cost of a p
2cdf0 61 74 68 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ath */.  LogEst 
2ce00 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
2ce10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce20 6f 75 74 70 75 74 73 20 2a 2f 0a 20 20 4c 6f 67  outputs */.  Log
2ce30 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20  Est mxCost = 0; 
2ce40 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
2ce50 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  m cost of a set 
2ce60 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f  of paths */.  Lo
2ce70 67 45 73 74 20 6d 78 4f 75 74 20 3d 20 30 3b 20  gEst mxOut = 0; 
2ce80 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2ce90 75 6d 20 6e 4f 75 74 20 76 61 6c 75 65 20 6f 6e  um nOut value on
2cea0 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 74 68   the set of path
2ceb0 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  s */.  LogEst rS
2cec0 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  ortCost;        
2ced0 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61   /* Cost to do a
2cee0 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   sort */.  int n
2cef0 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
2cf00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2cf10 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
2cf20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
2cf30 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
2cf40 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
2cf50 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
2cf60 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
2cf70 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
2cf80 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
2cf90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2cfa0 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
2cfb0 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
2cfc0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
2cfd0 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
2cfe0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
2cff0 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
2d000 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
2d010 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
2d020 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
2d030 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
2d040 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
2d050 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
2d060 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
2d070 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
2d080 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
2d090 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2d0a0 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
2d0b0 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
2d0c0 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
2d0d0 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
2d0e0 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20  emory */.  char 
2d0f0 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
2d100 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
2d110 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
2d120 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
2d130 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
2d140 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
2d150 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2d160 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
2d170 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
2d180 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
2d190 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
2d1a0 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
2d1b0 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
2d1c0 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
2d1d0 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
2d1e0 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
2d1f0 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
2d200 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
2d210 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
2d220 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
2d230 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
2d240 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p==1) ? 1 : (nLo
2d250 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
2d260 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
2d270 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
2d280 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
2d290 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
2d2a0 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
2d2b0 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20  ver\n"));..  /* 
2d2c0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2d2d0 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
2d2e0 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20  r aTo and aFrom 
2d2f0 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f  */.  ii = (sizeo
2d300 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a  f(WherePath)+siz
2d310 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
2d320 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a  nLoop)*mxChoice*
2d330 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  2;.  pSpace = sq
2d340 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2d350 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20  (db, ii);.  if( 
2d360 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
2d370 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d380 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
2d390 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
2d3a0 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
2d3b0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
2d3c0 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
2d3d0 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
2d3e0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
2d3f0 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
2d400 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
2d410 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
2d420 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
2d430 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
2d440 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
2d450 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a  Loop = pX;.  }..
2d460 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65    /* Seed the se
2d470 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67  arch with a sing
2d480 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e  le WherePath con
2d490 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65  taining zero Whe
2d4a0 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20  reLoops..  **.  
2d4b0 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f  ** TUNING: Do no
2d4c0 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72  t let the number
2d4d0 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67   of iterations g
2d4e0 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20  o above 25.  If 
2d4f0 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66  the cost.  ** of
2d500 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75   computing an au
2d510 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
2d520 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77   not paid back w
2d530 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
2d540 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  25.  ** rows, th
2d550 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  en do not use th
2d560 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
2d570 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d  x. */.  aFrom[0]
2d580 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72  .nRow = MIN(pPar
2d590 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20  se->nQueryLoop, 
2d5a0 34 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36  46);  assert( 46
2d5b0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2d5c0 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d  25) );.  nFrom =
2d5d0 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d   1;..  /* Precom
2d5e0 70 75 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66  pute the cost of
2d5f0 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e   sorting the fin
2d600 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69  al result set, i
2d610 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  f the caller.  *
2d620 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  * to sqlite3Wher
2d630 65 42 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e  eBegin() was con
2d640 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72  cerned about sor
2d650 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43  ting */.  rSortC
2d660 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ost = 0;.  if( p
2d670 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
2d680 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30  =0 || nRowEst==0
2d690 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d   ){.    aFrom[0]
2d6a0 2e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  .isOrderedValid 
2d6b0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
2d6c0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74    /* TUNING: Est
2d6d0 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73  imated cost of s
2d6e0 6f 72 74 69 6e 67 20 69 73 20 34 38 2a 4e 2a 6c  orting is 48*N*l
2d6f0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2d700 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
2d710 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
2d720 77 73 2e 20 54 68 65 20 34 38 20 69 73 20 74 68  ws. The 48 is th
2d730 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20  e expected size 
2d740 6f 66 20 61 20 72 6f 77 20 74 6f 20 73 6f 72 74  of a row to sort
2d750 2e 20 0a 20 20 20 20 2a 2a 20 46 49 58 4d 45 3a  . .    ** FIXME:
2d760 20 20 63 6f 6d 70 75 74 65 20 61 20 62 65 74 74    compute a bett
2d770 65 72 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  er estimate of t
2d780 68 65 20 34 38 20 6d 75 6c 74 69 70 6c 69 65 72  he 48 multiplier
2d790 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20   based on the.  
2d7a0 20 20 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20    ** result set 
2d7b0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a  expressions. */.
2d7c0 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20      rSortCost = 
2d7d0 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67  nRowEst + estLog
2d7e0 28 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57  (nRowEst);.    W
2d7f0 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
2d800 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
2d810 3d 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43  =%-3d\n", rSortC
2d820 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ost));.  }..  /*
2d830 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
2d840 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
2d850 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
2d860 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
2d870 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
2d880 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
2d890 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
2d8a0 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
2d8b0 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
2d8c0 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
2d8d0 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
2d8e0 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
2d8f0 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
2d900 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
2d910 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
2d920 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
2d930 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
2d940 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
2d950 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
2d960 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
2d970 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
2d980 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
2d990 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
2d9a0 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20  k maskNew;.     
2d9b0 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
2d9c0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
2d9d0 75 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69  u8 isOrderedVali
2d9e0 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
2d9f0 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20  eredValid;.     
2da00 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 20     u8 isOrdered 
2da10 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
2da20 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
2da30 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
2da40 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
2da50 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
2da60 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
2da70 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
2da80 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
2da90 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
2daa0 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  e;.        /* At
2dab0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c   this point, pWL
2dac0 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61  oop is a candida
2dad0 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78  te to be the nex
2dae0 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20  t loop. .       
2daf0 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20   ** Compute its 
2db00 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  cost */.        
2db10 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
2db20 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  ogEstAdd(pWLoop-
2db30 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
2db40 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
2db50 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f  ow);.        rCo
2db60 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
2db70 73 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72  stAdd(rCost, pFr
2db80 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20  om->rCost);.    
2db90 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d      nOut = pFrom
2dba0 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
2dbb0 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d  >nOut;.        m
2dbc0 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e  askNew = pFrom->
2dbd0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
2dbe0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2dbf0 20 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65       if( !isOrde
2dc00 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  redValid ){.    
2dc10 20 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68        switch( wh
2dc20 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
2dc30 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a  OrderBy(pWInfo,.
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc50 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
2dc60 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20  OrderBy, pFrom, 
2dc70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2dc80 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
2dc90 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70             iLoop
2dca0 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61  , pWLoop, &revMa
2dcb0 73 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sk) ){.         
2dcc0 20 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59     case 1:  /* Y
2dcd0 65 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f  es.  pFrom+pWLoo
2dce0 70 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74  p does satisfy t
2dcf0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2dd00 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  se */.          
2dd10 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
2dd20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2dd30 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2dd40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2dd50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2dd60 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f        case 0:  /
2dd70 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c  * No.  pFrom+pWL
2dd80 6f 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65  oop will require
2dd90 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
2dda0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2ddb0 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b    isOrdered = 0;
2ddc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ddd0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2dde0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2ddf0 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
2de00 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c  LogEstAdd(rCost,
2de10 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20   rSortCost);.   
2de20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2de30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  ;.            de
2de40 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74  fault: /* Cannot
2de50 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20   tell yet.  Try 
2de60 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78  again on the nex
2de70 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
2de80 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2de90 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2dea0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2deb0 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
2dec0 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
2ded0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2dee0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2def0 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
2df00 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
2df10 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62  o the mxChoice b
2df20 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
2df30 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
2df40 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
2df50 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
2df60 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
2df70 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
2df80 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
2df90 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
2dfa0 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64  Valid==isOrdered
2dfb0 56 61 6c 69 64 0a 20 20 20 20 20 20 20 20 20 20  Valid.          
2dfc0 20 26 26 20 28 28 70 54 6f 2d 3e 72 43 6f 73 74   && ((pTo->rCost
2dfd0 3c 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  <=rCost && pTo->
2dfe0 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20  nRow<=nOut) ||. 
2dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e000 70 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f 73  pTo->rCost>=rCos
2e010 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d  t && pTo->nRow>=
2e020 6e 4f 75 74 29 29 0a 20 20 20 20 20 20 20 20 20  nOut)).         
2e030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e040 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
2e050 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
2e060 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2e070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e080 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
2e090 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
2e0a0 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
2e0b0 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43  ce && rCost>=mxC
2e0c0 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ost ){.#ifdef WH
2e0d0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2e0e0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
2e0f0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2e100 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
2e110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e120 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2e130 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
2e140 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
2e150 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2e160 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2e170 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2e180 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2e190 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1b0 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2e1c0 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
2e1d0 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2e1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2e1f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
2e200 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2e210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e220 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20     /* Add a new 
2e230 50 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b  Path to the aTo[
2e240 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20  ] set */.       
2e250 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
2e260 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
2e270 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
2e280 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
2e290 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
2e2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
2e2b0 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
2e2c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e2d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
2e2e0 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
2e2f0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
2e300 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
2e310 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
2e320 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
2e330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e340 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
2e350 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
2e360 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2e370 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
2e380 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e390 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
2e3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2e3b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2e3c0 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
2e3d0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
2e3e0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
2e3f0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2e400 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
2e410 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
2e420 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
2e430 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2e440 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
2e450 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
2e460 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
2e470 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2e480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e490 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
2e4a0 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70  Cost<=rCost && p
2e4b0 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29  To->nRow<=nOut )
2e4c0 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
2e4d0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
2e4e0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
2e4f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2e500 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2e520 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e540 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
2e550 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
2e560 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
2e570 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2e580 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
2e590 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
2e5a0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2e5c0 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
2e5d0 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
2e5e0 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e600 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e610 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d     vs %s cost=%-
2e620 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e  3d,%d order=%c\n
2e630 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e640 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2e650 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
2e660 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
2e670 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
2e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2e690 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
2e6a0 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
2e6b0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2e6c0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2e6d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2e6e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e6f0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
2e700 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
2e710 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2e720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e730 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2e740 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
2e750 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
2e760 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74  /* A new and bet
2e770 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20  ter score for a 
2e780 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74  previously creat
2e790 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61  ed equivalent pa
2e7a0 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  th */.#ifdef WHE
2e7b0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2e7c0 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2e7d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2e7e0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
2e7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2e800 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e820 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74   "Update %s cost
2e830 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
2e840 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
2e850 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2e860 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
2e870 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
2e880 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
2e890 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
2e8a0 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
2e8b0 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
2e8c0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2e8d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2e8e0 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73  Printf("  was %s
2e8f0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
2e900 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
2e910 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2e920 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
2e930 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
2e940 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
2e950 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
2e960 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
2e970 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
2e980 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
2e990 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
2e9a0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2e9b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e9c0 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
2e9d0 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
2e9e0 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
2e9f0 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
2ea00 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
2ea10 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
2ea20 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
2ea30 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
2ea40 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
2ea50 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
2ea60 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
2ea70 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
2ea80 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
2ea90 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
2eaa0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 69  OrderedValid = i
2eab0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
2eac0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
2ead0 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65  dered = isOrdere
2eae0 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  d;.        memcp
2eaf0 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46  y(pTo->aLoop, pF
2eb00 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65  rom->aLoop, size
2eb10 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69  of(WhereLoop*)*i
2eb20 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70  Loop);.        p
2eb30 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  To->aLoop[iLoop]
2eb40 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20   = pWLoop;.     
2eb50 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
2eb60 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
2eb70 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20    mxI = 0;.     
2eb80 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54       mxCost = aT
2eb90 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20  o[0].rCost;.    
2eba0 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 61 54        mxOut = aT
2ebb0 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  o[0].nRow;.     
2ebc0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
2ebd0 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
2ebe0 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
2ebf0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
2ec00 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
2ec10 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70 54 6f  t>mxCost || (pTo
2ec20 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
2ec30 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f  && pTo->nRow>mxO
2ec40 75 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ut) ){.         
2ec50 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
2ec60 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
2ec70 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20          mxOut = 
2ec80 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20  pTo->nRow;.     
2ec90 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a           mxI = j
2eca0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  j;.            }
2ecb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ecc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ecd0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45     }..#ifdef WHE
2ece0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2ecf0 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69   /* >=2 */.    i
2ed00 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2ed10 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20  race>=2 ){.     
2ed20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2ed30 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
2ed40 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
2ed50 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
2ed60 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
2ed70 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
2ed80 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
2ed90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2eda0 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
2edb0 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
2edc0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
2edd0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
2ede0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
2edf0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
2ee00 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
2ee10 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
2ee20 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
2ee30 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
2ee40 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
2ee50 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2ee60 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
2ee70 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  && pTo->isOrdere
2ee80 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
2ee90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2eea0 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e  f(" rev=0x%llx\n
2eeb0 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29  ", pTo->revLoop)
2eec0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2eed0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2eee0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
2eef0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
2ef00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2ef10 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70  dif..    /* Swap
2ef20 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46   the roles of aF
2ef30 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20  rom and aTo for 
2ef40 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74  the next generat
2ef50 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d  ion */.    pFrom
2ef60 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20   = aTo;.    aTo 
2ef70 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72  = aFrom;.    aFr
2ef80 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20  om = pFrom;.    
2ef90 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d  nFrom = nTo;.  }
2efa0 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  ..  if( nFrom==0
2efb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2efc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2efd0 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69  "no query soluti
2efe0 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on");.    sqlite
2eff0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
2f000 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ce);.    return 
2f010 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2f020 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74  }.  .  /* Find t
2f030 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
2f040 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c  ath.  pFrom will
2f050 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
2f060 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a  g to that path *
2f070 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f  /.  pFrom = aFro
2f080 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  m;.  for(ii=1; i
2f090 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a  i<nFrom; ii++){.
2f0a0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72      if( pFrom->r
2f0b0 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72  Cost>aFrom[ii].r
2f0c0 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26  Cost ) pFrom = &
2f0d0 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20  aFrom[ii];.  }. 
2f0e0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2f0f0 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29  >nLevel==nLoop )
2f100 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ;.  /* Load the 
2f110 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
2f120 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a   into pWInfo */.
2f130 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
2f140 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
2f150 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  p++){.    WhereL
2f160 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70  evel *pLevel = p
2f170 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70  WInfo->a + iLoop
2f180 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57  ;.    pLevel->pW
2f190 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20  Loop = pWLoop = 
2f1a0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pFrom->aLoop[iLo
2f1b0 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  op];.    pLevel-
2f1c0 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d  >iFrom = pWLoop-
2f1d0 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65  >iTab;.    pLeve
2f1e0 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49  l->iTabCur = pWI
2f1f0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2f200 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
2f210 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  iCursor;.  }.  i
2f220 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
2f230 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
2f240 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30  ANT_DISTINCT)!=0
2f250 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
2f260 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2f270 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
2f280 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e  0.   && pWInfo->
2f290 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
2f2a0 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20  _DISTINCT_NOOP. 
2f2b0 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29    && nRowEst.  )
2f2c0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f  {.    Bitmask no
2f2d0 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  tUsed;.    int r
2f2e0 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  c = wherePathSat
2f2f0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
2f300 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52  Info, pWInfo->pR
2f310 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c  esultSet, pFrom,
2f320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f330 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54    WHERE_DISTINCT
2f340 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  BY, nLoop-1, pFr
2f350 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
2f360 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  1], &notUsed);. 
2f370 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70     if( rc==1 ) p
2f380 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2f390 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2f3a0 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20  T_ORDERED;.  }. 
2f3b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72   if( pFrom->isOr
2f3c0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28  dered ){.    if(
2f3d0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2f3e0 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2f3f0 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
2f400 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2f410 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
2f420 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
2f430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
2f440 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b  nfo->bOBSat = 1;
2f450 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
2f460 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
2f470 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
2f480 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f   }.  pWInfo->nRo
2f490 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
2f4a0 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
2f4b0 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
2f4c0 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
2f4d0 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
2f4e0 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
2f4f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2f500 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2f510 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
2f520 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
2f530 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
2f540 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
2f550 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
2f560 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
2f570 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
2f580 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
2f590 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
2f5a0 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
2f5b0 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
2f5c0 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
2f5d0 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
2f5e0 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
2f5f0 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
2f600 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
2f610 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
2f620 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
2f630 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2f640 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
2f650 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
2f660 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
2f670 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
2f680 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
2f690 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
2f6a0 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
2f6b0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
2f6c0 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
2f6d0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
2f6e0 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
2f6f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2f700 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
2f710 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2f720 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
2f730 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
2f740 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2f750 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
2f760 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
2f770 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2f780 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
2f790 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
2f7a0 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
2f7b0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
2f7c0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20  ndex *pIdx;.  . 
2f7d0 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
2f7e0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
2f7f0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2f800 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
2f810 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72  CE_TABLE ) retur
2f820 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
2f830 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2f840 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
2f850 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
2f860 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
2f870 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
2f880 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
2f890 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
2f8a0 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
2f8b0 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20  zIndex ) return 
2f8c0 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
2f8d0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
2f8e0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
2f8f0 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
2f900 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
2f910 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
2f920 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
2f930 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  ee.nSkip = 0;.  
2f940 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
2f950 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
2f960 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20  0, WO_EQ, 0);.  
2f970 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
2f980 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2f990 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
2f9a0 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  Q|WHERE_IPK|WHER
2f9b0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c  E_ONEROW;.    pL
2f9c0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  oop->aLTerm[0] =
2f9d0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f   pTerm;.    pLoo
2f9e0 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  p->nLTerm = 1;. 
2f9f0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
2fa00 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f  e.nEq = 1;.    /
2fa10 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
2fa20 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70  f a rowid lookup
2fa30 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c   is 10 */.    pL
2fa40 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20  oop->rRun = 33; 
2fa50 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c   /* 33==sqlite3L
2fa60 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  ogEst(10) */.  }
2fa70 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
2fa80 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
2fa90 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
2faa0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
2fab0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
2fac0 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
2fad0 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
2fae0 20 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79     assert( Array
2faf0 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
2fb00 72 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20  rmSpace)==4 );. 
2fb10 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
2fb20 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
2fb30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
2fb40 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
2fb50 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  0 .       || pId
2fb60 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79  x->nKeyCol>Array
2fb70 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
2fb80 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20  rmSpace) .      
2fb90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fba0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
2fbb0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
2fbc0 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
2fbd0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
2fbe0 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f  iCur, pIdx->aiCo
2fbf0 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45  lumn[j], 0, WO_E
2fc00 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  Q, pIdx);.      
2fc10 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
2fc20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2fc30 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
2fc40 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2fc50 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
2fc60 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  Idx->nKeyCol ) c
2fc70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2fc80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
2fc90 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
2fca0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
2fcb0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
2fcc0 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f    if( pIdx->isCo
2fcd0 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d  vering || (pItem
2fce0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
2fcf0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
2fd00 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
2fd10 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2fd20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
2fd30 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
2fd40 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
2fd50 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
2fd60 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
2fd70 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
2fd80 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2fd90 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
2fda0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
2fdb0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
2fdc0 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
2fdd0 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
2fde0 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71  = 39;  /* 39==sq
2fdf0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20  lite3LogEst(15) 
2fe00 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
2fe10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2fe20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29  pLoop->wsFlags )
2fe30 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  {.    pLoop->nOu
2fe40 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20  t = (LogEst)1;. 
2fe50 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
2fe60 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a  pWLoop = pLoop;.
2fe70 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53      pLoop->maskS
2fe80 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
2fe90 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2fea0 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
2feb0 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
2fec0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
2fed0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
2fee0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2fef0 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
2ff00 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31  nfo->bOBSat =  1
2ff10 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2ff20 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2ff30 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2ff40 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
2ff50 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2ff60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2ff70 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
2ff80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2ff90 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
2ffa0 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
2ffb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2ffc0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2ffd0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2ffe0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2fff0 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
30000 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
30010 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
30020 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
30030 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
30040 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
30050 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
30060 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
30070 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
30080 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
30090 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
300a0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
300b0 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
300c0 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
300d0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
300e0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
300f0 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
30100 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
30110 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
30120 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
30130 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
30140 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
30150 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
30160 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
30170 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
30180 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
30190 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
301a0 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
301b0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
301c0 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
301d0 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
301e0 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
301f0 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
30200 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
30210 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
30220 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
30230 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
30240 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
30250 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
30260 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
30270 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
30280 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
30290 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
302a0 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
302b0 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
302c0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
302d0 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
302e0 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
302f0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
30300 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
30310 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
30320 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
30330 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
30340 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
30350 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
30360 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
30370 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
30380 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
30390 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
303a0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
303b0 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303d0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
303e0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
303f0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30410 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
30420 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
30430 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
30440 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
30450 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
30460 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
30470 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
30480 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
30490 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
304a0 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
304b0 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
304c0 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
304d0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
304e0 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
304f0 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
30500 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
30510 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
30520 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
30530 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
30540 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
30550 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
30560 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
30570 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
30580 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
30590 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
305a0 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
305b0 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
305c0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
305d0 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
305e0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
305f0 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
30600 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
30610 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
30620 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
30630 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
30640 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
30650 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
30660 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
30670 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
30680 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
30690 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
306a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
306b0 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
306c0 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
306d0 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
306e0 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
306f0 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
30700 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
30710 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
30720 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
30730 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
30740 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
30750 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
30760 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
30770 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
30780 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
30790 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
307a0 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
307b0 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
307c0 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
307d0 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
307e0 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
307f0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
30800 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
30810 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
30820 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
30830 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
30840 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
30850 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
30860 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
30870 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
30880 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
30890 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
308a0 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
308b0 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
308c0 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
308d0 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
308e0 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
308f0 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
30900 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
30910 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
30920 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
30930 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
30940 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
30950 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
30960 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
30970 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
30980 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
30990 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
309a0 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
309b0 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
309c0 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
309d0 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
309e0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
309f0 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
30a00 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
30a10 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
30a20 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
30a30 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
30a40 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
30a50 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
30a60 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
30a70 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
30a80 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
30a90 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
30aa0 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
30ab0 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
30ac0 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
30ad0 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
30ae0 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
30af0 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
30b00 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
30b10 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
30b20 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
30b30 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
30b40 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
30b50 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
30b60 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
30b70 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
30b80 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
30b90 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
30ba0 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
30bb0 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
30bc0 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
30bd0 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
30be0 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
30bf0 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
30c00 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
30c10 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
30c20 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
30c30 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
30c40 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
30c50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
30c60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
30c70 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  or the GROUP BY 
30c80 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65  clause.** if the
30c90 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
30ca0 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63  lag is set in wc
30cb0 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53  trlFlags) of a S
30cc0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
30cd0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
30ce0 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
30cf0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
30d00 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
30d10 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
30d20 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
30d30 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
30d40 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
30d50 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
30d60 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72  *.** The iIdxCur
30d70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
30d80 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
30d90 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66  of an index.  If
30da0 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41   .** WHERE_ONETA
30db0 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
30dc0 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20   iIdxCur is the 
30dd0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
30de0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20   an index.** to 
30df0 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  use for OR claus
30e00 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  e processing.  T
30e10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
30e20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a  should use this.
30e30 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73  ** specific curs
30e40 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e  or.  If WHERE_ON
30e50 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73  EPASS_DESIRED is
30e60 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43   set, then iIdxC
30e70 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  ur is.** the fir
30e80 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20  st cursor in an 
30e90 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73  array of cursors
30ea0 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
30eb0 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c  .  iIdxCur shoul
30ec0 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  d.** be used to 
30ed0 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72  compute the appr
30ee0 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64  opriate cursor d
30ef0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
30f00 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73  h index is.** us
30f10 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
30f20 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
30f30 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
30f40 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
30f50 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
30f60 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
30f70 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
30f80 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
30f90 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
30fa0 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
30fb0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
30fc0 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
30fd0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
30fe0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
30ff0 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e  OrderBy,   /* An
31000 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31010 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  , or NULL */.  E
31020 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74  xprList *pResult
31030 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73  Set, /* Result s
31040 65 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  et of the query 
31050 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
31060 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ags,       /* On
31070 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
31080 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
31090 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
310a0 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20  .  int iIdxCur  
310b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57           /* If W
310c0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
310d0 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78  LY is set, index
310e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a   cursor number *
310f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
31100 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
31110 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20    /* Num. bytes 
31120 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68  allocated for Wh
31130 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a  ereInfo struct *
31140 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  /.  int nTabList
31150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
31170 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74  ents in pTabList
31180 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
31190 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
311a0 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
311b0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
311c0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
311d0 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
311e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
311f0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
31200 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
31210 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
31220 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
31230 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74   /* Cursors that
31240 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73   are not yet pos
31250 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65  itioned */.  Whe
31260 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57  reLoopBuilder sW
31270 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57  LB;     /* The W
31280 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72  hereLoop builder
31290 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
312a0 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
312b0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
312c0 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
312d0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
312e0 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  vel;        /* A
312f0 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
31300 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a   pWInfo->a[] */.
31310 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
31320 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
31330 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e  Pointer to a sin
31340 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  gle WhereLoop ob
31350 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69  ject */.  int ii
31360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31370 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31380 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
31390 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
313a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
313b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
313c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
313d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
313e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a  eturn code */...
313f0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e    /* Variable in
31400 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
31410 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
31420 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c  b;.  memset(&sWL
31430 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c  B, 0, sizeof(sWL
31440 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64  B));.  sWLB.pOrd
31450 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
31460 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74  ..  /* Disable t
31470 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69  he DISTINCT opti
31480 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49  mization if SQLI
31490 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69  TE_DistinctOpt i
314a0 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73  s set via.  ** s
314b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c  qlite3_test_ctrl
314c0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
314d0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e  _OPTIMIZATIONS,.
314e0 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..) */.  if( Opt
314f0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
31500 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73  d(db, SQLITE_Dis
31510 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20  tinctOpt) ){.   
31520 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e   wctrlFlags &= ~
31530 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
31540 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  NCT;.  }..  /* T
31550 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
31560 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
31570 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
31580 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
31590 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
315a0 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
315b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
315c0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20  List->nSrc==BMS 
315d0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  );.  if( pTabLis
315e0 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
315f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
31600 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
31610 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
31620 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
31630 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
31640 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  }..  /* This fun
31650 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67  ction normally g
31660 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65  enerates a neste
31670 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74  d loop for all t
31680 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70  ables in .  ** p
31690 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66  TabList.  But if
316a0 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41   the WHERE_ONETA
316b0 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73  BLE_ONLY flag is
316c0 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68   set, then we sh
316d0 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67  ould.  ** only g
316e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
316f0 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
31700 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64   in pTabList and
31710 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a   assume that.  *
31720 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73  * any cursors as
31730 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75  sociated with su
31740 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20  bsequent tables 
31750 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  are uninitialize
31760 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69  d..  */.  nTabLi
31770 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73  st = (wctrlFlags
31780 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
31790 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54  E_ONLY) ? 1 : pT
317a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20  abList->nSrc;.. 
317b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
317c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
317d0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
317e0 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
317f0 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65  come the.  ** re
31800 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69  turn value. A si
31810 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ngle allocation 
31820 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
31830 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20   the WhereInfo. 
31840 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20   ** struct, the 
31850 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72  contents of Wher
31860 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57  eInfo.a[], the W
31870 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
31880 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ture.  ** and th
31890 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
318a0 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20  tructure. Since 
318b0 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74  WhereClause cont
318c0 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20  ains an 8-byte. 
318d0 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20   ** field (type 
318e0 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74  Bitmask) it must
318f0 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61   be aligned on a
31900 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
31910 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61  y on.  ** some a
31920 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65  rchitectures. He
31930 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29  nce the ROUND8()
31940 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e   below..  */.  n
31950 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
31960 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
31970 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
31980 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
31990 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
319a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
319b0 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57  cZero(db, nByteW
319c0 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68  Info + sizeof(Wh
319d0 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28  ereLoop));.  if(
319e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
319f0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
31a00 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
31a10 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
31a20 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
31a30 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
31a40 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  }.  pWInfo->aiCu
31a50 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57  rOnePass[0] = pW
31a60 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
31a70 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57  ss[1] = -1;.  pW
31a80 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
31a90 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
31aa0 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
31ab0 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
31ac0 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
31ad0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t;.  pWInfo->pOr
31ae0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
31af0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  ;.  pWInfo->pRes
31b00 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74  ultSet = pResult
31b10 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  Set;.  pWInfo->i
31b20 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e  Break = pWInfo->
31b30 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
31b40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
31b50 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  (v);.  pWInfo->w
31b60 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
31b70 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
31b80 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
31b90 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
31ba0 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
31bb0 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
31bc0 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
31bd0 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
31be0 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
31bf0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
31c00 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
31c10 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
31c20 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
31c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
31c40 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
31c50 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
31c60 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
31c70 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
31c80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
31c90 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
31ca0 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
31cb0 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
31cc0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
31cd0 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
31ce0 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
31cf0 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
31d00 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
31d10 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
31d20 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
31d30 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
31d40 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
31d50 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
31d60 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
31d70 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49   whereSplit(&pWI
31d80 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65  nfo->sWC, pWhere
31d90 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
31da0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
31db0 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
31dc0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
31dd0 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
31de0 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
31df0 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
31e00 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
31e10 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
31e20 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  hru..  */.  for(
31e30 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57  ii=0; ii<sWLB.pW
31e40 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  C->nTerm; ii++){
31e50 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73  .    if( nTabLis
31e60 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
31e70 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
31e80 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61  Join(sWLB.pWC->a
31e90 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
31ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
31eb0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
31ec0 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
31ed0 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69  pExpr, pWInfo->i
31ee0 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20  Break,.         
31ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f00 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
31f10 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70  L);.      sWLB.p
31f20 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67  WC->a[ii].wtFlag
31f30 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
31f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
31f50 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e   Special case: N
31f60 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  o FROM clause.  
31f70 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  */.  if( nTabLis
31f80 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
31f90 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
31fa0 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20  o->bOBSat = 1;. 
31fb0 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
31fc0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
31fd0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
31fe0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
31ff0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
32000 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
32010 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  }.  }..  /* Assi
32020 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
32030 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
32040 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
32050 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
32060 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
32070 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
32080 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
32090 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
320a0 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
320b0 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
320c0 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
320d0 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
320e0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
320f0 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
32100 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
32110 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
32120 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
32130 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
32140 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
32150 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
32160 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
32170 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
32180 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
32190 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
321a0 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
321b0 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
321c0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
321d0 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
321e0 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
321f0 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
32200 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
32210 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
32220 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
32230 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
32240 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
32250 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
32260 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
32270 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
32280 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
32290 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
322a0 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
322b0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
322c0 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
322d0 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
322e0 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
322f0 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
32300 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
32310 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
32320 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
32330 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
32340 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
32350 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
32360 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
32370 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
32380 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
32390 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
323a0 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
323b0 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
323c0 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
323d0 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
323e0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
323f0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
32400 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
32410 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
32420 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
32430 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
32440 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
32450 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
32460 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65    Bitmask m = ge
32470 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
32480 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
32490 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
324a0 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
324b0 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
324c0 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
324d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
324e0 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
324f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
32500 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
32510 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
32520 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
32530 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
32540 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
32550 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
32560 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
32570 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
32580 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
32590 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
325a0 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
325b0 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
325c0 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
325d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
325e0 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
325f0 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
32600 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
32610 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
32620 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
32630 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
32640 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
32650 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
32660 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
32670 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
32680 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
32690 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
326a0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
326b0 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
326c0 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
326d0 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
326e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
326f0 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
32700 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
32710 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
32720 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
32730 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
32740 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
32750 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
32760 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
32770 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
32780 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
32790 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
327a0 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
327b0 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
327c0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
327d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
327e0 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
327f0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
32800 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
32810 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
32820 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
32830 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
32840 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
32850 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
32860 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
32870 29 29 3b 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79  ));.  /* Display
32880 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
32890 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
328a0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  /.#if defined(WH
328b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
328c0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
328d0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
328e0 45 58 50 4c 41 49 4e 29 0a 20 20 69 66 28 20 73  EXPLAIN).  if( s
328f0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
32900 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
32910 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20  int i;.    Vdbe 
32920 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
32930 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  be;.    sqlite3E
32940 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a  xplainBegin(v);.
32950 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
32960 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
32970 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
32980 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
32990 28 76 2c 20 22 23 25 2d 32 64 20 22 2c 20 69 29  (v, "#%-2d ", i)
329a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
329b0 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a 20  xplainPush(v);. 
329c0 20 20 20 20 20 77 68 65 72 65 45 78 70 6c 61 69       whereExplai
329d0 6e 54 65 72 6d 28 76 2c 20 26 73 57 4c 42 2e 70  nTerm(v, &sWLB.p
329e0 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20 20 20 20 20  WC->a[i]);.     
329f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
32a00 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  op(v);.      sql
32a10 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29  ite3ExplainNL(v)
32a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
32a30 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68  te3ExplainFinish
32a40 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
32a50 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
32a60 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  , sqlite3VdbeExp
32a70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20  lanation(v));.  
32a80 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  }.#endif.  if( n
32a90 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
32aa0 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
32ab0 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
32ac0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
32ad0 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
32ae0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
32af0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
32b00 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61      /* Display a
32b10 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ll of the WhereL
32b20 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77  oop objects if w
32b30 68 65 72 65 74 72 61 63 65 20 69 73 20 65 6e 61  heretrace is ena
32b40 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57  bled */.#ifdef W
32b50 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32b60 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 20 20  D /* !=0 */.    
32b70 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32b80 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57  Trace ){.      W
32b90 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
32ba0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
32bb0 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62  static char zLab
32bc0 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  el[] = "01234567
32bd0 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  89abcdefghijklmn
32be0 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20  opqrstuvwyxz".  
32bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c10 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
32c20 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
32c30 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
32c40 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
32c50 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
32c60 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
32c70 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
32c80 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c  abel[i%sizeof(zL
32c90 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
32ca0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
32cb0 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
32cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
32cd0 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
32ce0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
32cf0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
32d00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
32d10 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
32d20 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
32d30 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
32d40 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
32d50 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
32d60 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
32d70 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
32d80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
32d90 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
32da0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
32db0 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
32dc0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
32dd0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
32de0 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
32df0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
32e00 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28  nfo->revMask = (
32e10 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20  Bitmask)(-1);.  
32e20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
32e30 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62  nErr || NEVER(db
32e40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
32e50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
32e60 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
32e70 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
32e80 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d  CE_ENABLED /* !=
32e90 30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  0 */.  if( sqlit
32ea0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
32eb0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
32ec0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32ed0 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
32ee0 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
32ef0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
32f00 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f    if( pWInfo->bO
32f10 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71  BSat ){.      sq
32f20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32f30 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c  (" ORDERBY=0x%ll
32f40 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  x", pWInfo->revM
32f50 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
32f60 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
32f70 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
32f80 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
32f90 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
32fa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32fb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
32fc0 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
32fd0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
32ff0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
33000 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
33010 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
33020 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
33030 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
33040 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
33050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
33060 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
33070 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
33080 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
33090 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
330a0 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
330b0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
330c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
330d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
330e0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
330f0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
33100 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
33110 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
33120 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
33130 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
33140 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d  sWLB.pWC);.    }
33150 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
33160 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
33170 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
33180 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
33190 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
331a0 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
331b0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
331c0 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
331d0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
331e0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
331f0 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
33200 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
33210 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
33220 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
33230 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
33240 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
33250 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
33260 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78   ) tabUsed |= ex
33270 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
33280 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
33290 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77  pOrderBy);.    w
332a0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
332b0 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
332c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
332d0 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
332e0 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
332f0 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
33300 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
33310 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
33320 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
33330 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65  ->iTab].jointype
33340 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
33350 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
33360 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
33370 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
33380 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
33390 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
333a0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
333b0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
333c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
333d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
333e0 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
333f0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
33400 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
33410 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
33420 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
33430 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
33440 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
33450 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
33460 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
33470 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
33480 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
33490 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
334a0 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
334b0 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
334c0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
334d0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
334e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
334f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33500 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
33510 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
33520 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
33530 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
33540 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
33550 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
33560 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
33570 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
33580 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
33590 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
335a0 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
335b0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
335c0 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
335d0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
335e0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
335f0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
33600 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
33610 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
33620 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
33630 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
33640 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
33650 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
33660 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
33670 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
33680 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
33690 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
336a0 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
336b0 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
336c0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
336d0 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
336e0 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
336f0 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
33700 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
33710 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33720 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
33730 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
33740 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
33750 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
33760 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
33770 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26  SIRED)!=0 .   &&
33780 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70   (pWInfo->a[0].p
33790 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
337a0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d   WHERE_ONEROW)!=
337b0 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
337c0 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
337d0 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
337e0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
337f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70  pTab) ){.      p
33800 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
33810 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  op->wsFlags &= ~
33820 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
33830 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
33840 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
33850 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
33860 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
33870 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
33880 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
33890 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
338a0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
338b0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
338c0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
338d0 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
338e0 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
338f0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
33900 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
33910 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
33920 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
33930 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
33940 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
33950 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
33960 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
33970 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
33980 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
33990 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
339a0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
339b0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
339c0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
339d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
339e0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
339f0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
33a00 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
33a10 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
33a20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
33a30 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
33a40 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
33a50 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
33a60 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
33a70 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
33a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33a90 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
33aa0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
33ab0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
33ac0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
33ad0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
33ae0 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
33af0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
33b00 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
33b10 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
33b20 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
33b30 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
33b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
33b50 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
33b60 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
33b70 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
33b80 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
33b90 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
33ba0 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
33bb0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
33bc0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
33bd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
33be0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
33bf0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
33c00 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
33c10 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
33c20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
33c30 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
33c40 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33c50 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20  okOnePass ){.   
33c60 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
33c70 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
33c80 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
33c90 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
33ca0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
33cb0 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
33cc0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
33cd0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
33ce0 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
33cf0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
33d00 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
33d10 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
33d20 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
33d30 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
33d40 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
33d50 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
33d60 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
33d70 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
33d80 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
33d90 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
33da0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
33db0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
33dc0 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
33dd0 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
33de0 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
33df0 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
33e00 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
33e10 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
33e20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
33e30 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
33e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33e50 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
33e60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
33e70 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
33e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
33ea0 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
33eb0 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
33ec0 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
33ed0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
33ee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33ef0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
33f00 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
33f10 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
33f20 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
33f30 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
33f40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
33f50 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
33f60 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
33f70 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
33f80 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
33f90 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
33fa0 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
33fb0 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
33fc0 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61   iIdxCur is alwa
33fd0 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70  ys set if to a p
33fe0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
33ff0 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73   ONEPASS is poss
34000 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ible */.      as
34010 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30  sert( iIdxCur!=0
34020 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
34030 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
34040 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
34050 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
34060 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
34070 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  ss ){.        In
34080 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
34090 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
340a0 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
340b0 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  Cur = iIdxCur;. 
340c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
340d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
340e0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
340f0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
34100 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
34110 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
34120 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
34130 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
34140 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
34150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34160 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
34170 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
34180 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
34190 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
341a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
341b0 69 49 64 78 43 75 72 20 26 26 20 28 77 63 74 72  iIdxCur && (wctr
341c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
341d0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
341e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64   ){.        iInd
341f0 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b  exCur = iIdxCur;
34200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34210 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
34220 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
34230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34240 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
34250 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
34260 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
34270 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
34280 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
34290 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
342a0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
342b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
342c0 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72  v, op, iIndexCur
342d0 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
342e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
342f0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
34300 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
34310 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34320 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
34330 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
34340 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
34350 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
34360 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
34370 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
34380 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
34390 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
343a0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
343b0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
343c0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
343d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
343e0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
343f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
34400 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
34410 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
34420 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
34430 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
34440 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
34450 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
34460 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
34470 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
34480 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
34490 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
344a0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
344b0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
344c0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
344d0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
344e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
344f0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
34500 5b 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51  [ii];.#ifndef SQ
34510 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
34520 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
34530 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  ( (pLevel->pWLoo
34540 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34550 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
34560 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
34570 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
34580 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e  ex(pParse, &pWIn
34590 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20  fo->sWC,.       
345a0 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69           &pTabLi
345b0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
345c0 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20  rom], notReady, 
345d0 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69  pLevel);.      i
345e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
345f0 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
34600 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
34610 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78 70  }.#endif.    exp
34620 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
34630 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
34640 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
34650 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
34660 61 67 73 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ags);.    pLevel
34670 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
34680 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
34690 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
346a0 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
346b0 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
346c0 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
346d0 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
346e0 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
346f0 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20  ddrCont;.  }..  
34700 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64  /* Done. */.  Vd
34710 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
34720 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
34730 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75  -core"));.  retu
34740 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
34750 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
34760 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
34770 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
34780 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
34790 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
347a0 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
347b0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
347c0 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
347d0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
347e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
347f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
34800 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
34810 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
34820 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
34830 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
34840 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
34850 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
34860 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
34870 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
34880 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
34890 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
348a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
348b0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
348c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
348d0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
348e0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
348f0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
34900 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
34910 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
34920 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
34930 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
34940 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
34950 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
34960 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56  n code..  */.  V
34970 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
34980 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
34990 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74  core"));.  sqlit
349a0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
349b0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
349c0 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i=pWInfo->nLevel
349d0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
349e0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
349f0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
34a00 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c  fo->a[i];.    pL
34a10 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
34a20 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  Loop;.    sqlite
34a30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34a40 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
34a50 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
34a60 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
34a70 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
34a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
34a90 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
34aa0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
34ab0 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33  ->p2, pLevel->p3
34ac0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34ad0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
34ae0 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
34af0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
34b00 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
34b10 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
34b20 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29  el->op==OP_Next)
34b30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
34b40 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
34b50 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  ->op==OP_Prev);.
34b60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
34b70 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
34b80 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20  op==OP_VNext);. 
34b90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
34ba0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
34bb0 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70  ERE_IN_ABLE && p
34bc0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e  Level->u.in.nIn>
34bd0 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
34be0 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
34bf0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
34c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
34c10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
34c20 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20  vel->addrNxt);. 
34c30 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
34c40 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e  l->u.in.nIn, pIn
34c50 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  =&pLevel->u.in.a
34c60 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30  InLoop[j-1]; j>0
34c70 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20  ; j--, pIn--){. 
34c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34c90 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
34ca0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b  n->addrInTop+1);
34cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34cc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
34cd0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
34ce0 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
34cf0 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
34d00 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
34d10 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
34d20 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
34d30 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
34d40 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20  P_PrevIfOpen);. 
34d50 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
34d60 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45  ageIf(v, pIn->eE
34d70 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78  ndLoopOp==OP_Nex
34d80 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  tIfOpen);.      
34d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
34da0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
34db0 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
34dc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
34dd0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
34de0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
34df0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
34e00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
34e10 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
34e20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
34e30 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
34e40 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
34e50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34e60 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
34e70 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
34e80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34e90 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
34ea0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
34eb0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
34ec0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
34ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
34ee0 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
34ef0 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
34f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
34f10 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
34f20 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
34f30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
34f40 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
34f50 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
34f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34f70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
34f80 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
34f90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34fa0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
34fb0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
34fc0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
34fd0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
34fe0 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    || (pLoop->wsF
34ff0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
35000 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
35010 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
35020 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
35030 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
35040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35050 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
35060 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
35070 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
35080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35090 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
350a0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
350b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
350c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
350d0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
350e0 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
350f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35100 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
35110 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
35120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35130 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
35140 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
35150 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
35160 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35180 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
35190 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
351a0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
351b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
351c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
351d0 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  addr);.    }.   
351e0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
351f0 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
35200 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69  E-loop%d: %s", i
35210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35220 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
35230 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
35240 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e  l->iFrom].pTab->
35250 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20  zName));.  }..  
35260 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
35270 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
35280 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
35290 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
352a0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
352b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
352c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
352d0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
352e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  );..  assert( pW
352f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
35300 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
35310 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
35320 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
35330 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
35340 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
35350 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a     int k, last;.
35360 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
35370 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
35380 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
35390 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
353a0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
353b0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
353c0 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
353d0 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
353e0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
353f0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
35400 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
35410 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
35420 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75   /* For a co-rou
35430 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c  tine, change all
35440 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72   OP_Column refer
35450 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62  ences to the tab
35460 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
35470 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f   co-routine into
35480 20 4f 50 5f 53 43 6f 70 79 20 6f 66 20 72 65 73   OP_SCopy of res
35490 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
354a0 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
354b0 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
354c0 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
354d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
354e0 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
354f0 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  ine && !db->mall
35500 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
35510 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
35520 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
35530 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c  v);.      k = pL
35540 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a  evel->addrBody;.
35550 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
35560 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
35570 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  k);.      for(; 
35580 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
35590 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
355a0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
355b0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
355c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
355d0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
355e0 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
355f0 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
35600 65 20 3d 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20  e = OP_SCopy;.  
35610 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
35620 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 70 54 61 62  = pOp->p2 + pTab
35630 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 3b  Item->regResult;
35640 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
35650 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  p2 = pOp->p3;.  
35660 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20          pOp->p3 
35670 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
35680 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
35690 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
356a0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
356b0 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
356c0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
356d0 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  p1 = 0;.        
356e0 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
356f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35700 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
35710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
35720 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lose all of the 
35730 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72  cursors that wer
35740 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
35750 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20  te3WhereBegin.. 
35760 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f     ** Except, do
35770 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f   not close curso
35780 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  rs that will be 
35790 72 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52  reused by the OR
357a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
357b0 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54    ** (WHERE_OMIT
357c0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41  _OPEN_CLOSE).  A
357d0 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20  nd do not close 
357e0 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  the OP_OpenWrite
357f0 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20   cursors.    ** 
35800 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20  created for the 
35810 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
35820 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
35830 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
35840 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
35850 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  ral)==0.     && 
35860 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
35870 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
35880 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
35890 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
358a0 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  LOSE)==0.    ){.
358b0 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
358c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
358d0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
358e0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
358f0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
35900 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
35910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35920 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
35930 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35940 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
35950 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
35960 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
35970 20 20 20 20 20 20 20 26 26 20 28 77 73 20 26 20         && (ws & 
35980 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
35990 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30  _AUTO_INDEX))==0
359a0 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65 76   .       && pLev
359b0 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49  el->iIdxCur!=pWI
359c0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
359d0 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20  s[1].      ){.  
359e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
359f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
35a00 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
35a10 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
35a20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
35a30 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
35a40 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44  n index, make VD
35a50 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  BE code substitu
35a60 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
35a70 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
35a80 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  he index instead
35a90 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62   of from the tab
35aa0 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  le where possibl
35ab0 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  e.  In some case
35ac0 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70  s.    ** this op
35ad0 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65  timization preve
35ae0 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72  nts the table fr
35af0 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65  om ever being re
35b00 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20  ad, which can.  
35b10 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67    ** yield a sig
35b20 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d  nificant perform
35b30 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20  ance boost..    
35b40 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
35b50 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
35b60 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
35b70 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
35b80 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
35b90 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
35ba0 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
35bb0 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
35bc0 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
35bd0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
35be0 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
35bf0 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
35c00 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
35c10 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
35c20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
35c30 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
35c40 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
35c50 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
35c60 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
35c70 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
35c80 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
35c90 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
35ca0 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ED|WHERE_IDX_ONL
35cb0 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  Y) ){.      pIdx
35cc0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
35cd0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  e.pIndex;.    }e
35ce0 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
35cf0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
35d00 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
35d10 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
35d20 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
35d30 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
35d40 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
35d50 65 64 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  ed ){.      last
35d60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
35d70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
35d80 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e      k = pLevel->
35d90 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20  addrBody;.      
35da0 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
35db0 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20  eGetOp(v, k);.  
35dc0 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74      for(; k<last
35dd0 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
35de0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
35df0 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
35e00 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
35e10 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
35e20 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
35e30 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
35e40 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b  int x = pOp->p2;
35e50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
35e60 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d  t( pIdx->pTable=
35e70 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  =pTab );.       
35e80 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
35e90 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
35ea0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
35eb0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
35ec0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
35ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
35ee0 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78   pPk->aiColumn[x
35ef0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
35f00 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c           x = sql
35f10 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
35f20 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20  x(pIdx, x);.    
35f30 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29        if( x>=0 )
35f40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
35f50 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20  p->p2 = x;.     
35f60 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
35f70 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
35f80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35f90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35fa0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
35fb0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
35fc0 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a  )==0 || x>=0 );.
35fd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
35fe0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
35ff0 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
36000 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
36010 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
36020 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
36030 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
36040 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
36050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
36060 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
36070 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72  anup.  */.  pPar
36080 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
36090 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
360a0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72  ueryLoop;.  wher
360b0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
360c0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
360d0 0a 7d 0a                                         .}.