/ Hex Artifact Content
Login

Artifact e3724b7b31d1e13869308ed4125305364f7d823a:


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 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53  * Return ONEPASS
0840: 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20 55  _OFF (0) if an U
0850: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0860: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61  statement is una
0870: 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74  ble to.** operat
0880: 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68  e directly on th
0890: 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64  e rowis returned
08a0: 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75   by a WHERE clau
08b0: 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f  se.  Return.** O
08c0: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31  NEPASS_SINGLE (1
08d0: 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) if the stateme
08e0: 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e  nt can operation
08f0: 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75 73   directly becaus
0900: 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67  e only.** a sing
0910: 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20  le row is to be 
0920: 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e  changed.  Return
0930: 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28   ONEPASS_MULTI (
0940: 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61  2) if the one-pa
0950: 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  ss.** optimizati
0960: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f  on can be used o
0970: 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a  n multiple .**.*
0980: 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53  * If the ONEPASS
0990: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
09a0: 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72   used (if this r
09b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
09c0: 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73  rue).** then als
09d0: 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69  o write the indi
09e0: 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73  ces of open curs
09f0: 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50  ors used by ONEP
0a00: 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75  ASS.** into aiCu
0a10: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0a20: 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74  ].  iaCur[0] get
0a30: 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20  s the cursor of 
0a40: 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c  the data.** tabl
0a50: 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67  e and iaCur[1] g
0a60: 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75  ets the cursor u
0a70: 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69  sed by an auxili
0a80: 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69  ary index..** Ei
0a90: 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62  ther value may b
0aa0: 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67  e -1, indicating
0ab0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20   that cursor is 
0ac0: 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79  not used..** Any
0ad0: 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65   cursors returne
0ae0: 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  d will have been
0af0: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
0b00: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72  ing..**.** aiCur
0b10: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
0b20: 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20   both get -1 if 
0b30: 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65  the where-clause
0b40: 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61   logic is.** una
0b50: 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f  ble to use the O
0b60: 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
0b70: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
0b80: 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73  te3WhereOkOnePas
0b90: 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  s(WhereInfo *pWI
0ba0: 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29  nfo, int *aiCur)
0bb0: 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72  {.  memcpy(aiCur
0bc0: 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  , pWInfo->aiCurO
0bd0: 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69  nePass, sizeof(i
0be0: 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57  nt)*2);.#ifdef W
0bf0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
0c00: 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
0c10: 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57 49  hereTrace && pWI
0c20: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
0c30: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
0c40: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
0c50: 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72 73  intf("%s cursors
0c60: 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  : %d %d\n",.    
0c70: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e       pWInfo->eOn
0c80: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53  ePass==ONEPASS_S
0c90: 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53  INGLE ? "ONEPASS
0ca0: 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50  _SINGLE" : "ONEP
0cb0: 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20  ASS_MULTI",.    
0cc0: 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61       aiCur[0], a
0cd0: 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65  iCur[1]);.  }.#e
0ce0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57  ndif.  return pW
0cf0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a  Info->eOnePass;.
0d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0d10: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0d20: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0d30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0d40: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0d50: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0d60: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0d70: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0d80: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0d90: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0da0: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0db0: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0dc0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0dd0: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0de0: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0df0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0e00: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0e10: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0e20: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0e30: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0e40: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0e50: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0e60: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0e70: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0e80: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0e90: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0ea0: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0eb0: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0ec0: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0ed0: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0ee0: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0ef0: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0f00: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0f10: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0f20: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0f30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0f40: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0f50: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0f60: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0f70: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0f90: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0fa0: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0fb0: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0fc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0fd0: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0fe0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0ff0: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
1000: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
1010: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
1020: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
1030: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
1040: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
1050: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
1060: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
1070: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
1080: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
1090: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
10a0: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
10b0: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
10c0: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
10d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10f0: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
1100: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
1110: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
1120: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
1130: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
1140: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
1150: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
1160: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1170: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
1180: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
1190: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
11a0: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
11b0: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
11c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
11d0: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
11e0: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
11f0: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
1200: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
1210: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
1220: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1230: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1240: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1250: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
1260: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
1270: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
1280: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
1290: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
12a0: 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74  */.Bitmask sqlit
12b0: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57  e3WhereGetMask(W
12c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
12d0: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
12e0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
12f0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1300: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
1310: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
1320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
1330: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
1340: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
1350: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
1360: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1370: 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
1380: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
13a0: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
13b0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
13c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
13d0: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
13e0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
13f0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
1400: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
1410: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1420: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
1430: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
1440: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
1450: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
1460: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
1470: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
1480: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
1490: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
14a0: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
14b0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
14c0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
14d0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
14e0: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
14f0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
1500: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
1510: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
1520: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
1530: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
1540: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  sor;.}../*.** Ad
1550: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1560: 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74  t WhereTerm that
1570: 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69   matches accordi
1580: 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72  ng to the criter
1590: 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65  ia.** establishe
15a0: 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e  d when the pScan
15b0: 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74   object was init
15c0: 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65  ialized by where
15d0: 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52  ScanInit()..** R
15e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
15f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1600: 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65  matching WhereTe
1610: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  rms..*/.static W
1620: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
1630: 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61  canNext(WhereSca
1640: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74  n *pScan){.  int
1650: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
1660: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1670: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1680: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20  e term */.  i16 
1690: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
16a0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
16b0: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
16c0: 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49   term.  -1 for I
16d0: 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  PK */.  Expr *pX
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  An expression be
1700: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
1710: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1720: 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  ;    /* Shorthan
1730: 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43  d for pScan->pWC
1740: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1750: 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68  *pTerm;    /* Th
1760: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73  e term being tes
1770: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d  ted */.  int k =
1780: 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a   pScan->k;    /*
1790: 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20   Where to start 
17a0: 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77  scanning */..  w
17b0: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
17c0: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
17d0: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
17e0: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53   pScan->aiCur[pS
17f0: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1800: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53      iColumn = pS
1810: 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 53  can->aiColumn[pS
1820: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1830: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
1840: 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63 61  =XN_EXPR && pSca
1850: 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29  n->pIdxExpr==0 )
1860: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
1870: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
1880: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
1890: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
18a0: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
18b0: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
18c0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
18d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
18e0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
18f0: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
1900: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
1910: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
1920: 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52  iColumn!=XN_EXPR
1930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
1940: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1950: 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  are(pTerm->pExpr
1960: 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70  ->pLeft,pScan->p
1970: 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30  IdxExpr,iCur)==0
1980: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
1990: 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20  Scan->iEquiv<=1 
19a0: 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
19b0: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
19c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
19d0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
19e0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1a00: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
1a10: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
1a20: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
1a30: 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20  pScan->aiCur).  
1a40: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20           && (pX 
1a50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1a60: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
1a70: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d  pExpr->pRight))-
1a80: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
1a90: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
1ab0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1ac0: 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71  =0; j<pScan->nEq
1ad0: 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  uiv; j++){.     
1ae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
1af0: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58  an->aiCur[j]==pX
1b00: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
1b10: 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e          && pScan
1b20: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70  ->aiColumn[j]==p
1b30: 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  X->iColumn ){.  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b80: 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e   if( j==pScan->n
1b90: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20  Equiv ){.       
1ba0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69         pScan->ai
1bb0: 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61  Cur[j] = pX->iTa
1bc0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
1bd0: 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75     pScan->aiColu
1be0: 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c  mn[j] = pX->iCol
1bf0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
1c00: 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76     pScan->nEquiv
1c10: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1c20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1c30: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
1c40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1c50: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
1c60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1c70: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
1c80: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
1c90: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
1ca0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
1cb0: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
1cc0: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
1cd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1ce0: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
1d00: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
1d20: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
1d30: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d50: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1d60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1d70: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
1d80: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
1d90: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1db0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dd0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1de0: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1e00: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
1e10: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1e20: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
1e60: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
1e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e80: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
1e90: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1ea0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ec0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1ed0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
1ee0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
1ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f00: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f30: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1f40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1f50: 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a  O_EQ|WO_IS))!=0.
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1f70: 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  (pX = pTerm->pEx
1f80: 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d  pr->pRight)->op=
1f90: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
1fa0: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
1fb0: 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69  Table==pScan->ai
1fc0: 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  Cur[0].         
1fd0: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
1fe0: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c  mn==pScan->aiCol
1ff0: 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  umn[0].         
2000: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2010: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2020: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2030: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
2040: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2050: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2060: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
2070: 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20  n->k = k+1;.    
2080: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2090: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
20a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20b0: 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d    }.      pScan-
20c0: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
20d0: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
20e0: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   k = 0;.    }.  
20f0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
2100: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20  Scan->pOrigWC;. 
2110: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53     k = 0;.    pS
2120: 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20  can->iEquiv++;. 
2130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2150: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
2160: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
2170: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2180: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
2190: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
21a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
21b0: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
21c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
21d0: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
21e0: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
21f0: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
2200: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
2210: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
2220: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
2230: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
2240: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
2250: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
2260: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
2270: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
2280: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
2290: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
22a0: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
22b0: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
22c0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
22d0: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
22e0: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
22f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2300: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
2310: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
2320: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
2330: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
2340: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
2350: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
2360: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
2370: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
2380: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
2390: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
23a0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
23b0: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
23c0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
23d0: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
23e0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
23f0: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
2400: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  Idx..*/.static W
2410: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
2420: 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65  canInit(.  Where
2430: 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20  Scan *pScan,    
2440: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53     /* The WhereS
2450: 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  can object being
2460: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2470: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2480: 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC,       /* The
2490: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
24a0: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
24b0: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
24c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
24d0: 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  or to scan for *
24e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2500: 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f  olumn to scan fo
2510: 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73  r */.  u32 opMas
2520: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
2530: 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f  * Operator(s) to
2540: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49   scan for */.  I
2550: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2560: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
2570: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
2580: 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  h this index */.
2590: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a  ){.  int j = 0;.
25a0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
25b0: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
25c0: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
25d0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
25e0: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
25f0: 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e  = pWC;.  pScan->
2600: 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20  pIdxExpr = 0;.  
2610: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
2620: 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  j = iColumn;.   
2630: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
2640: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2650: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58    if( iColumn==X
2660: 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d 3e  N_EXPR ) pScan->
2670: 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d  pIdxExpr = pIdx-
2680: 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
2690: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  pExpr;.  }.  if(
26a0: 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e   pIdx && iColumn
26b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e  >=0 ){.    pScan
26c0: 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d  ->idxaff = pIdx-
26d0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
26e0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
26f0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
2700: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
2710: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
2720: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
2730: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
2740: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
2750: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2760: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2770: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2780: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2790: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
27a0: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
27b0: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
27c0: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
27d0: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
27e0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
27f0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2800: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2810: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2820: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2830: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2840: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2850: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2860: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2870: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2880: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
2890: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
28a0: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
28b0: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
28c0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
28d0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
28e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28f0: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
2900: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
2910: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49  und..**.** If pI
2920: 64 78 21 3d 30 20 74 68 65 6e 20 73 65 61 72 63  dx!=0 then searc
2930: 68 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63  h for terms matc
2940: 68 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e  hing the iColumn
2950: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49  -th column of pI
2960: 64 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  dx.** rather tha
2970: 6e 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  n the iColumn-th
2980: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2990: 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iCur..**.** The
29a0: 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d   term returned m
29b0: 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e  ight by Y=<expr>
29c0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f   if there is ano
29d0: 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20  ther constraint 
29e0: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
29f0: 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63  clause that spec
2a00: 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20  ifies that X=Y. 
2a10: 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72   Any such constr
2a20: 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  aints will be.**
2a30: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
2a40: 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20  he WO_EQUIV bit 
2a50: 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f  in the pTerm->eO
2a60: 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20  perator field.  
2a70: 54 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69  The.** aiCur[]/i
2a80: 61 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73  aColumn[] arrays
2a90: 20 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20   hold X and all 
2aa0: 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e  its equivalents.
2ab0: 20 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a   There are 11.**
2ac0: 20 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b   slots in aiCur[
2ad0: 5d 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20  ]/aiColumn[] so 
2ae0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
2af0: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
2b00: 73 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74  s up to 10.** ot
2b10: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
2b20: 61 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20  alues.  Hence a 
2b30: 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c  search for X wil
2b40: 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20  l return <expr> 
2b50: 69 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41  if X=A1.** and A
2b60: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61  1=A2 and A2=A3 a
2b70: 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31  nd ... and A9=A1
2b80: 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e  0 and A10=<expr>
2b90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
2ba0: 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65   are multiple te
2bb0: 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
2bc0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
2bd0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2be0: 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20  r>".** then try 
2bf0: 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68  for the one with
2c00: 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73   no dependencies
2c10: 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20   on <expr> - in 
2c20: 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72  other words wher
2c30: 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61  e.** <expr> is a
2c40: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
2c50: 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  sion of some kin
2c60: 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20  d.  Only return 
2c70: 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68  entries of.** th
2c80: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
2c90: 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63  " where Y is a c
2ca0: 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72  olumn in another
2cb0: 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72   table if no ter
2cc0: 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  ms of.** the for
2cd0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74  m "X <op> <const
2ce0: 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20  -expr>" exist.  
2cf0: 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74   If no terms wit
2d00: 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53  h a constant RHS
2d10: 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74  .** exist, try t
2d20: 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20  o return a term 
2d30: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
2d40: 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57  e WO_EQUIV..*/.W
2d50: 68 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65  hereTerm *sqlite
2d60: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a  3WhereFindTerm(.
2d70: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2d80: 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
2d90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
2da0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
2db0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
2dc0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2dd0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2de0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
2df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e00: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  mn number of LHS
2e10: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
2e20: 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52  tReady,     /* R
2e30: 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72  HS must not over
2e40: 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61  lap with this ma
2e50: 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20  sk */.  u32 op, 
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e70: 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76   Mask of WO_xx v
2e80: 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67  alues describing
2e90: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49   operator */.  I
2ea0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2eb0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2ec0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
2ed0: 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e  this index, if n
2ee0: 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
2ef0: 57 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75  WhereTerm *pResu
2f00: 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54  lt = 0;.  WhereT
2f10: 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53  erm *p;.  WhereS
2f20: 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d  can scan;..  p =
2f30: 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
2f40: 73 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c  scan, pWC, iCur,
2f50: 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49   iColumn, op, pI
2f60: 64 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f  dx);.  op &= WO_
2f70: 45 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c  EQ|WO_IS;.  whil
2f80: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
2f90: 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  (p->prereqRight 
2fa0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
2fb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
2fc0: 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26  rereqRight==0 &&
2fd0: 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f   (p->eOperator&o
2fe0: 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)!=0 ){.       
2ff0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f   testcase( p->eO
3000: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
3010: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3020: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
3030: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
3040: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
3050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
3060: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
3070: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
3080: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
3090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30a0: 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74  n searches pList
30b0: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68   for an entry th
30c0: 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
30d0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
30e0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
30f0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
3100: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
3110: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
3120: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
3130: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
3140: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
3150: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
3160: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
3170: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
3180: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
3190: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
31a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
31b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
31c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
31f0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
3200: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3220: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
3230: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
3240: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
3250: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3270: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
3280: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
3290: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32b0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
32c0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
32d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
32e0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
32f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
3300: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
3310: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
3320: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3330: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
3340: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
3350: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3360: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3370: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
3380: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
3390: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
33a0: 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
33b0: 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
33c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
33d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
33e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
33f0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
3400: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
3410: 70 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  pColl && 0==sqli
3420: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
3430: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
3440: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3450: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
3460: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3470: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
3480: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
3490: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
34a0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  of index pIdx is
34b0: 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61   NOT NULL.*/.sta
34c0: 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c  tic int indexCol
34d0: 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78  umnNotNull(Index
34e0: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
34f0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
3500: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
3510: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
3520: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
3530: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20  >nColumn );.  j 
3540: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
3550: 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e  [iCol];.  if( j>
3560: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3570: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
3580: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a  Col[j].notNull;.
3590: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28    }else if( j==(
35a0: 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
35b0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
35c0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32    assert( j==(-2
35d0: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
35e0: 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e  0;  /* Assume an
35f0: 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73   indexed express
3600: 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79  ion can always y
3610: 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a  ield a NULL */..
3620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
3630: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
3640: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
3650: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
3660: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
3670: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
3680: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
3690: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
36a0: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79  redundant if any
36b0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63   subset of the c
36c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  olumns in the.**
36d0: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61   DISTINCT list a
36e0: 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  re collectively 
36f0: 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76  unique and indiv
3700: 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c  idually non-null
3710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3720: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
3730: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
3740: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
3750: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3760: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
3770: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
3780: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
3790: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
37a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
37b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
37c0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
37d0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
37e0: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  t       /* The r
37f0: 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e  esult set that n
3800: 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49  eeds to be DISTI
3810: 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  NCT */.){.  Tabl
3820: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
3830: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
3860: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
3870: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
3880: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
3890: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
38a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
38b0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
38c0: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
38d0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
38e0: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
38f0: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
3900: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
3910: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
3920: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
3930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
3940: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
3950: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
3960: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
3970: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
3980: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
3990: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
39a0: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
39b0: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
39c0: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
39d0: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
39e0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
39f0: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
3a00: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
3a10: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
3a20: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
3a30: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
3a40: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
3a50: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
3a60: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
3a70: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3a80: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3a90: 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d  llate(pDistinct-
3aa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3ab0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3ac0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
3ad0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
3ae0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
3af0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
3b00: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
3b10: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
3b20: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
3b30: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
3b40: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
3b50: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
3b60: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
3b70: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
3b80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
3b90: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
3ba0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
3bb0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
3bc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
3bd0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
3be0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
3bf0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
3c00: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
3c10: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
3c20: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
3c30: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
3c40: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
3c50: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
3c60: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
3c70: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
3c80: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
3c90: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
3ca0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
3cb0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
3cc0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
3cd0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
3ce0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
3cf0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
3d00: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
3d10: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
3d20: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
3d30: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
3d40: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
3d50: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
3d60: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
3d70: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
3d80: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
3d90: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
3da0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
3db0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
3dc0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
3dd0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
3de0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
3df0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
3e00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
3e10: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
3e20: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
3e30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
3e40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
3e50: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
3e60: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
3e70: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
3e80: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
3e90: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
3ea0: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
3eb0: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
3ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3ed0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
3ee0: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
3ef0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
3f00: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
3f10: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
3f20: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
3f30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
3f40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3f50: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
3f60: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
3f70: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
3f80: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
3f90: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
3fa0: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
3fb0: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
3fc0: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
3fd0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
3fe0: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
3ff0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
4000: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
4010: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
4020: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
4030: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
4040: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
4050: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
4060: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
4070: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
4080: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
4090: 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74  o OP_Copy when t
40a0: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
40b0: 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  g accessed via c
40c0: 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e  o-routine .** in
40d0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
40e0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a  le lookup..**.**
40f0: 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77   If the bIncrRow
4100: 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  id parameter is 
4110: 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52  0, then any OP_R
4120: 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  owid instruction
4130: 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69  s on.** cursor i
4140: 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73  TabCur are trans
4150: 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e  formed into OP_N
4160: 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63  ull. Or, if bInc
4170: 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  rRowid is non-ze
4180: 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68  ro,.** then each
4190: 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61   OP_Rowid is tra
41a0: 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e  nsformed into an
41b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
41c0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  increment the.**
41d0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
41e0: 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69   its output regi
41f0: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
4200: 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f  void translateCo
4210: 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64  lumnToCopy(.  Vd
4220: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4230: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f    /* The VDBE co
4240: 6e 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f  ntaining code to
4250: 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20   translate */.  
4260: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
4270: 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65      /* Translate
4280: 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64   from this opcod
4290: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  e to the end */.
42a0: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
42b0: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75        /* OP_Colu
42c0: 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65  mn/OP_Rowid refe
42d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
42e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
42f0: 65 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a  egister,      /*
4300: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   The first colum
4310: 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67  n is in this reg
4320: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  ister */.  int b
4330: 49 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f  IncrRowid      /
4340: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * If non-zero, t
4350: 72 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69  ransform OP_rowi
4360: 64 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31  d to OP_AddImm(1
4370: 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70  ) */.){.  VdbeOp
4380: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
4390: 64 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61  dbeGetOp(v, iSta
43a0: 72 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  rt);.  int iEnd 
43b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
43c0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66  rentAddr(v);.  f
43d0: 6f 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64  or(; iStart<iEnd
43e0: 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b  ; iStart++, pOp+
43f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  +){.    if( pOp-
4400: 3e 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63  >p1!=iTabCur ) c
4410: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
4420: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
4430: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
4440: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
4450: 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f  P_Copy;.      pO
4460: 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20  p->p1 = pOp->p2 
4470: 2b 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20  + iRegister;.   
4480: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70     pOp->p2 = pOp
4490: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ->p3;.      pOp-
44a0: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  >p3 = 0;.    }el
44b0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
44c0: 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
44d0: 20 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52        if( bIncrR
44e0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
44f0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
4500: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
4510: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
4520: 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e  of the OP_Rowid.
4530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   */.        pOp-
4540: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64  >opcode = OP_Add
4550: 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  Imm;.        pOp
4560: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ->p1 = pOp->p2;.
4570: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
4580: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
4590: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  {.        pOp->o
45a0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
45b0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
45c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
45d0: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20  p->p3 = 0;.     
45e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
45f0: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
4600: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
4610: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
4620: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
4630: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
4640: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
4650: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
4660: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
4670: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
4680: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
4690: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
46a0: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
46b0: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
46c0: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
46d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
46e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
46f0: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
4700: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
4710: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
4720: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
4730: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4740: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4750: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4760: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4780: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
4790: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
47a0: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
47b0: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
47c0: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
47d0: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
47e0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
47f0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4800: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
4810: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4820: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
4830: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
4840: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
4850: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4860: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
4870: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4880: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
4890: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
48a0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
48b0: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
48c0: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
48d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
48e0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
48f0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
4900: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
4910: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
4920: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4930: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
4940: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4950: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4960: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4970: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4980: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4990: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
49a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
49b0: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
49c0: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
49d0: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
49e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
49f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
4a00: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
4a10: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4a20: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
4a30: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
4a40: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4a50: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
4a60: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
4a70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4a80: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
4a90: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
4aa0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4ab0: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
4ac0: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
4ad0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
4ae0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4af0: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b00: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
4b10: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
4b20: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4b30: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b40: 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20  edRows=%lld\n", 
4b50: 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  p->estimatedRows
4b60: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
4b70: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
4b80: 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
4b90: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
4ba0: 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
4bb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4bc0: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
4bd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
4be0: 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
4bf0: 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
4c00: 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
4c10: 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
4c20: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
4c30: 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
4c40: 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
4c50: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
4c60: 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4c80: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
4c90: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
4ca0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
4cb0: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
4cc0: 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
4cd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4cf0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
4d00: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
4d10: 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
4d20: 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
4d40: 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
4d50: 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
4d60: 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
4d70: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
4d80: 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
4d90: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
4da0: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4db0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
4dc0: 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  _EQ|WO_IS))==0 )
4dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4de0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
4df0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4e00: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
4e10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
4e20: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
4e30: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
4e40: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
4e50: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
4e60: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
4e70: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
4e80: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
4e90: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
4ea0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
4eb0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
4ec0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4ed0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
4ee0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
4ef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4f00: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4f10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4f20: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
4f30: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
4f40: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
4f50: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
4f60: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
4f70: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
4f80: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
4f90: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
4fa0: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
4fb0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
4fc0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
4fd0: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
4fe0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
4ff0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5010: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
5020: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
5030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5040: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5050: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5060: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5070: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5080: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5090: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
50a0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
50b0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
50c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
50d0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
50e0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
50f0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
5100: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
5110: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
5120: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
5130: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5160: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5170: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5190: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
51a0: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
51b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
51c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
51d0: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
51e0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
51f0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
5200: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
5210: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
5220: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
5230: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5240: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5270: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5280: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5290: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
52b0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
52c0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
52d0: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
52e0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5300: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
5310: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5320: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
5330: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5340: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5350: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5360: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5370: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5380: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5390: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
53a0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
53b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
53c0: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
53d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
53f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5400: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5420: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5430: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5440: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5450: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5460: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5470: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5480: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5490: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
54b0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
54c0: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
54e0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
54f0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
5500: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5510: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5520: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5530: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5540: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5550: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5560: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5570: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5580: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5590: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
55a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
55b0: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
55c0: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
55d0: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
55e0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
55f0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
5600: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5610: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5620: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5630: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5640: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5650: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5660: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5670: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5680: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5690: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
56a0: 64 64 72 43 6f 75 6e 74 65 72 3b 20 20 20 20 20  ddrCounter;     
56b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
56c0: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
56d0: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
56e0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
56f0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5700: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5710: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
5720: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
5730: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
5740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5750: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
5760: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
5770: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
5780: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
5790: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
57a0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
57b0: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
57c0: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
57d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
57e0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
57f0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
5800: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
5810: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
5820: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
5830: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5840: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
5850: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5860: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
5870: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
5880: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
5890: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
58a0: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
58b0: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
58c0: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
58d0: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
58e0: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
58f0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
5900: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
5910: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
5920: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
5930: 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
5940: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
5950: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
5960: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5970: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
5980: 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72  omJoin)    /* pr
5990: 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  ereq always non-
59a0: 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20  zero */.        
59b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
59c0: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63  tJoinTable!=pSrc
59d0: 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20  ->iCursor   /*  
59e0: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
59f0: 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  and   */.       
5a00: 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72    || pLoop->prer
5a10: 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  eq!=0 );        
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a30: 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46    table of a LEF
5a40: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66  T JOIN */.    if
5a50: 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d  ( pLoop->prereq=
5a60: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
5a70: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
5a80: 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20  M_VIRTUAL)==0.  
5a90: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
5aa0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5ab0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
5ac0: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
5ad0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45  TableConstant(pE
5ae0: 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  xpr, pSrc->iCurs
5af0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  or) ){.      pPa
5b00: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45  rtial = sqlite3E
5b10: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
5b20: 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20  b, pPartial,.   
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5b50: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
5b60: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
5b70: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
5b80: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
5b90: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
5ba0: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
5bb0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5bc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
5bd0: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
5be0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
5bf0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
5c00: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
5c10: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
5c20: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
5c30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
5c40: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
5c50: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
5c60: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
5c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5c80: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
5c90: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
5ca0: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
5cb0: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
5cc0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
5cd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
5ce0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
5cf0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
5d00: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
5d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d20: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d30: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5d40: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
5d50: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
5d60: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
5d70: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
5d80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
5d90: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
5da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5db0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
5dc0: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
5dd0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
5de0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
5df0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5e00: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
5e10: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
5e20: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
5e30: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
5e40: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
5e50: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
5e60: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
5e70: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
5e80: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
5ea0: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
5eb0: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
5ec0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
5ed0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
5ee0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
5ef0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
5f00: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
5f10: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
5f20: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
5f30: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
5f40: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
5f50: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
5f60: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
5f70: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
5f80: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
5f90: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
5fa0: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
5fb0: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
5fc0: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
5fd0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5fe0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
5ff0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
6000: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
6010: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
6020: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
6030: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
6040: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
6050: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
6060: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
6070: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
6080: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
6090: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
60a0: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
60b0: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
60c0: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
60d0: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
60e0: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
60f0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
6100: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6110: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
6120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
6130: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
6140: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6150: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
6160: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
6170: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
6180: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
6190: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
61a0: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
61b0: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
61c0: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
61d0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
61e0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
61f0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
6200: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
6210: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
6220: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
6230: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
6240: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
6250: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
6260: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
6270: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
6280: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
6290: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
62a0: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
62b0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
62c0: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
62d0: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
62e0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
62f0: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
6300: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
6310: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
6320: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
6330: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
6340: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6350: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6360: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6370: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6380: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6390: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
63a0: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
63b0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
63c0: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
63d0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
63e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
63f0: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
6400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
6410: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
6420: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
6430: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
6440: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6450: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
6460: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
6470: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
6480: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
6490: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
64a0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
64b0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
64c0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
64d0: 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20  ll[n] = pColl ? 
64e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
64f0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
6500: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
6510: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6520: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
6530: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
6540: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
6550: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
6560: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
6570: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6580: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
6590: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
65a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
65b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
65c0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
65d0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
65e0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
65f0: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
6600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6610: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
6620: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6630: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
6640: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
6650: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
6660: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
6670: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
6680: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6690: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
66a0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
66b0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
66c0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
66d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
66e0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
66f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6700: 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49  = XN_ROWID;.  pI
6710: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6720: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
6730: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6740: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6750: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6760: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6770: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6780: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6790: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
67a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
67b0: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
67c0: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
67d0: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
67e0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
67f0: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6800: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
6810: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
6820: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6830: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6840: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6850: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6860: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6870: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6880: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6890: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
68a0: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
68b0: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
68c0: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
68d0: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
68e0: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
68f0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
6900: 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d     addrCounter =
6910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6920: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6930: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6950: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
6960: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
6970: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
6980: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64  illSub);.    add
6990: 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56  rTop =  sqlite3V
69a0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
69b0: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
69c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
69d0: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
69e0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
69f0: 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c   row of \"%s\"",
6a00: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
6a10: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  >zName));.  }els
6a20: 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  e{.    addrTop =
6a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a40: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
6a50: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6a60: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6a70: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
6a80: 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43  artial ){.    iC
6a90: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6aa0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6ac0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6ad0: 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e  , pPartial, iCon
6ae0: 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tinue, SQLITE_JU
6af0: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
6b00: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
6b10: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
6b20: 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f  X;.  }.  regReco
6b30: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
6b40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b50: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
6b60: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
6b70: 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73  Key(.      pPars
6b80: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
6b90: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
6ba0: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a  ord, 0, 0, 0, 0.
6bb0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
6bc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6bd0: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
6be0: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
6bf0: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6c00: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c10: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c20: 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
6c30: 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
6c40: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6c50: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
6c60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6c70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6c80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6c90: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
6ca0: 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73  rCounter, regBas
6cb0: 65 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  e+n);.    transl
6cc0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
6cd0: 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76  v, addrTop, pLev
6ce0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61  el->iTabCur, pTa
6cf0: 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
6d00: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6d10: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
6d20: 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49  rTop);.    pTabI
6d30: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6d40: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6d50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6d60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6d70: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6d80: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
6d90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6da0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6db0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6dc0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
6dd0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
6de0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6df0: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6e00: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6e10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6e20: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6e30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6e40: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6e50: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6e60: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6e70: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6e80: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
6e90: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
6ea0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
6eb0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
6ec0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6ed0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
6ee0: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6ef0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6f00: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6f10: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6f20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6f30: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6f40: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6f50: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6f60: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6f70: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6f80: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
6f90: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
6fa0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
6fb0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
6fc0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
6fd0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
6fe0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
6ff0: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
7000: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
7010: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
7020: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
7030: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
7040: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
7050: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
7060: 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
7070: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
7080: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73   /* Ignore terms
7090: 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72   with these prer
70a0: 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eqs */.  struct 
70b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
70c0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
70d0: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
70e0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
70f0: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
7100: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7110: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
7120: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
7130: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
7140: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
7150: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
7160: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7170: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
7180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7190: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
71a0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
71b0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
71c0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
71d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
71e0: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
71f0: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
7200: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
7210: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
7220: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
7230: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
7240: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
7250: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
7260: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
7270: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
7280: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
7290: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
72a0: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
72b0: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
72c0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
72d0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
72e0: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
72f0: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
7300: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
7310: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7320: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
7330: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7340: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7350: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7370: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7380: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
7390: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
73a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
73b0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
73c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
73d0: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
73e0: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
73f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7400: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
7410: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
7420: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7430: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
7440: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d  u.leftColumn>=(-
7450: 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  1) );.    nTerm+
7460: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
7470: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7480: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
7490: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
74a0: 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
74b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
74c0: 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
74d0: 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
74e0: 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
74f0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7500: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
7510: 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
7520: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
7530: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
7540: 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
7550: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
7560: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
7570: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
7580: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7590: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
75a0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
75b0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
75c0: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
75d0: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
75e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
75f0: 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
7600: 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
7610: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
7620: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7630: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7640: 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
7650: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7660: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
7670: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
7680: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
76b0: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
76c0: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
76f0: 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
7700: 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
7710: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
7720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7730: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
7740: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
7750: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7760: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
7770: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
7780: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
7790: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
77a0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
77b0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
77c0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
77d0: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
77e0: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
77f0: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
7800: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
7810: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
7820: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
7830: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
7840: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
7850: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
7860: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
7870: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7880: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
7890: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
78a0: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
78b0: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
78c0: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
78d0: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
78e0: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
78f0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7900: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
7910: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
7920: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7930: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
7940: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
7950: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
7960: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
7970: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
7980: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7990: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
79a0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
79b0: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
79c0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
79d0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
79e0: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
79f0: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
7a00: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7a10: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7a20: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
7a30: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7a40: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7a90: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
7aa0: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
7ab0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
7ac0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
7ad0: 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
7ae0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7af0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7b00: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7b10: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7b20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7b30: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7b40: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7b50: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7b60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b70: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7b80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7b90: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7ba0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7bb0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7bc0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
7bd0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7be0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7bf0: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
7c00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7c10: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7c20: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
7c30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
7c40: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
7c50: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
7c60: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
7c70: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7c80: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7c90: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
7ca0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7cb0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
7cc0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
7cd0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
7ce0: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
7cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
7d00: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
7d10: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
7d20: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
7d30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7d40: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
7d50: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
7d60: 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
7d70: 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
7d80: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
7d90: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
7db0: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
7dc0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
7dd0: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
7de0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7df0: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
7e00: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
7e10: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
7e20: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
7e30: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
7e40: 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
7e50: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7e60: 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
7e70: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
7e80: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
7e90: 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
7ea0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
7eb0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
7ec0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
7ed0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
7ee0: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
7ef0: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
7f00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7f10: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
7f20: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
7f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7f40: 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
7f50: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7f60: 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
7f70: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
7f80: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
7f90: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
7fa0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
7fb0: 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
7fc0: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
7fd0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
7fe0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7ff0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
8000: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8010: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
8020: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
8030: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
8040: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
8050: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8060: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
8070: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
8080: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
8090: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
80a0: 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
80b0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
80c0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
80d0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
80e0: 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
80f0: 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
8100: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
8110: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
8120: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
8130: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
8140: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
8150: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
8160: 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
8170: 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
8180: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8190: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
81a0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
81b0: 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
81c0: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
81d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
81e0: 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
81f0: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
8200: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
8210: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
8220: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
8230: 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
8240: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
8250: 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
8260: 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
8270: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
8280: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
8290: 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
82a0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
82b0: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
82c0: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
82d0: 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
82e0: 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
82f0: 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
8300: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
8310: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
8320: 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
8330: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
8340: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
8350: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8360: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
8370: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
8380: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
8390: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
83a0: 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
83b0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
83c0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
83d0: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
83e0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
83f0: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
8400: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
8410: 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
8420: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8430: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
8440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8450: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
8460: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
8470: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
8480: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
8490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
84a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
84b0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
84c0: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
84d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
84e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
84f0: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
8500: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
8510: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
8520: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
8530: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
8540: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
8550: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
8560: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
8570: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
8580: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
8590: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
85a0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
85b0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
85c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
85d0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
85e0: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
85f0: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8600: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8610: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8620: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8630: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
8640: 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
8650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8660: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8670: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
8680: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8690: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
86a0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
86b0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
86c0: 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
86d0: 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
86e0: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
86f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
8700: 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
8710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
8720: 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
8730: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
8740: 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20  ss than pRec.** 
8750: 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
8760: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8770: 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52  rows equal to pR
8780: 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ec.**.** Return 
8790: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
87a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
87b0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d  the smallest sam
87c0: 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67  ple that.** is g
87d0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
87e0: 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f  qual to pRec. No
87f0: 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  te that this ind
8800: 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64  ex is not an ind
8810: 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61  ex.** into the a
8820: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d  Sample[] array -
8830: 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20   it is an index 
8840: 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73  into a virtual s
8850: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  et of samples.**
8860: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
8870: 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c  ntents of aSampl
8880: 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  e[] and the numb
8890: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
88a0: 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e  record .** pRec.
88b0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
88c0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
88d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88f0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8900: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
8910: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
8920: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
8930: 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
8940: 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
8950: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
8960: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
8970: 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
8980: 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
8990: 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
89a0: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
89b0: 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
89c0: 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
89d0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
89e0: 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
89f0: 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
8a00: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
8a10: 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
8a20: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
8a30: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
8a40: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
8a50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8a60: 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
8a70: 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
8a80: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
8ab0: 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70  irst sample >= p
8ac0: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61  Rec */.  int iSa
8ad0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
8ae0: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
8af0: 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
8b00: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8b10: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  pRec */.  int iM
8b20: 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
8b30: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
8b40: 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
8b50: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
8b60: 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20   iTest;         
8b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
8b80: 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20   sample to test 
8b90: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
8bc0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
8bd0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  on */.  int nFie
8be0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
8bf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8c00: 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20   fields in pRec 
8c10: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  */.  tRowcnt iLo
8c20: 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wer = 0;        
8c30: 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45   /* anLt[] + anE
8c40: 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73  q[] of largest s
8c50: 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20  ample pRec is > 
8c60: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
8c70: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
8c80: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
8c90: 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
8ca0: 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
8cb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
8cc0: 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
8cd0: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
8ce0: 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63  nField>0 && pRec
8cf0: 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e  ->nField<=pIdx->
8d00: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20  nSampleCol );.. 
8d10: 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20   /* Do a binary 
8d20: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
8d30: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
8d40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
8d50: 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52  equal.  ** to pR
8d60: 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74  ec. If pRec cont
8d70: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69  ains a single fi
8d80: 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20  eld, the set of 
8d90: 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63  samples to searc
8da0: 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79  h.  ** is simply
8db0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
8dc0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d  rray. If the sam
8dd0: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
8de0: 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20  ] contain more. 
8df0: 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65   ** than one fie
8e00: 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20  lds, all fields 
8e10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
8e20: 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  rst are ignored.
8e30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52  .  **.  ** If pR
8e40: 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  ec contains N fi
8e50: 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73  elds, where N is
8e60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20   more than one, 
8e70: 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20  then as well as 
8e80: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73  the.  ** samples
8e90: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74   in aSample[] (t
8ea0: 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69  runcated to N fi
8eb0: 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63  elds), the searc
8ec0: 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20  h also has to.  
8ed0: 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66  ** consider pref
8ee0: 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61  ixes of those sa
8ef0: 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  mples. For examp
8f00: 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f  le, if the set o
8f10: 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69  f samples.  ** i
8f20: 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20  n aSample is:.  
8f30: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  **.  **     aSam
8f40: 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20  ple[0] = (a, 5) 
8f50: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8f60: 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a  e[1] = (a, 10) .
8f70: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
8f80: 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20  [2] = (b, 5) .  
8f90: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33  **     aSample[3
8fa0: 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20  ] = (c, 100) .  
8fb0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34  **     aSample[4
8fc0: 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a  ] = (c, 105).  *
8fd0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
8fe0: 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f  search space sho
8ff0: 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74  uld ideally be t
9000: 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65  he samples above
9010: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75   and the .  ** u
9020: 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b  nique prefixes [
9030: 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e  a], [b] and [c].
9040: 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20   But since that 
9050: 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e  is hard to organ
9060: 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63  ize, .  ** the c
9070: 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61  ode actually sea
9080: 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a  rches this set:.
9090: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a    **.  **     0:
90a0: 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31   (a) .  **     1
90b0: 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (a, 5) .  **  
90c0: 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20     2: (a, 10) . 
90d0: 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31   **     3: (a, 1
90e0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20  0) .  **     4: 
90f0: 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a  (b) .  **     5:
9100: 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
9110: 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20    6: (c) .  **  
9120: 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a     7: (c, 100) .
9130: 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20    **     8: (c, 
9140: 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a  105).  **     9:
9150: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
9160: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d   ** For each sam
9170: 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70  ple in the aSamp
9180: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61  le[] array, N sa
9190: 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  mples are presen
91a0: 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66  t in the.  ** ef
91b0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61  fective sample a
91c0: 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f  rray. In the abo
91d0: 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e  ve, samples 0 an
91e0: 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e  d 1 are based on
91f0: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53   .  ** sample aS
9200: 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65  ample[0]. Sample
9210: 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61  s 2 and 3 on aSa
9220: 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a  mple[1] etc..  *
9230: 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61  *.  ** Often, sa
9240: 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62  mple i of each b
9250: 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74  lock of N effect
9260: 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20  ive samples has 
9270: 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20  (i+1) fields..  
9280: 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20  ** Except, each 
9290: 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78  sample may be ex
92a0: 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65  tended to ensure
92b0: 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61   that it is grea
92c0: 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a  ter than or.  **
92d0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72   equal to the pr
92e0: 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e  evious sample in
92f0: 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20   the array. For 
9300: 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20  example, in the 
9310: 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d  above, .  ** sam
9320: 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72  ple 2 is the fir
9330: 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62  st sample of a b
9340: 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65  lock of N sample
9350: 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69  s, so at first i
9360: 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20  t .  ** appears 
9370: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62  that it should b
9380: 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a  e 1 field in siz
9390: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  e. However, that
93a0: 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a   would make it .
93b0: 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61    ** smaller tha
93c0: 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74  n sample 1, so t
93d0: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
93e0: 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e   would not work.
93f0: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20   As a result, . 
9400: 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64   ** it is extend
9410: 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73  ed to two fields
9420: 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73  . The duplicates
9430: 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74   that this creat
9440: 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20  es do not .  ** 
9450: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
9460: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c  ms..  */.  nFiel
9470: 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  d = pRec->nField
9480: 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ;.  iCol = 0;.  
9490: 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  iSample = pIdx->
94a0: 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64  nSample * nField
94b0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
94c0: 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iSamp;          
94d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
94e0: 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  ex in aSample[] 
94f0: 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  of test sample *
9500: 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  /.    int n;    
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9530: 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20   fields in test 
9540: 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  sample */..    i
9550: 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61  Test = (iMin+iSa
9560: 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61  mple)/2;.    iSa
9570: 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69  mp = iTest / nFi
9580: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61  eld;.    if( iSa
9590: 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mp>0 ){.      /*
95a0: 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66   The proposed ef
95b0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69  fective sample i
95c0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61  s a prefix of sa
95d0: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61  mple aSample[iSa
95e0: 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70  mp]..      ** Sp
95f0: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20  ecifically, the 
9600: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
9610: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b  of at least (1 +
9620: 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a   iTest%nField) .
9630: 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20        ** fields 
9640: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
9650: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
9660: 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  s effective samp
9670: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
9680: 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69  r(n=(iTest % nFi
9690: 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65  eld) + 1; n<nFie
96a0: 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; n++){.      
96b0: 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53    if( aSample[iS
96c0: 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  amp-1].anLt[n-1]
96d0: 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  !=aSample[iSamp]
96e0: 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65  .anLt[n-1] ) bre
96f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
9710: 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20   iTest + 1;.    
9720: 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  }..    pRec->nFi
9730: 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73  eld = n;.    res
9740: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
9750: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9760: 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53  ple[iSamp].n, aS
9770: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20  ample[iSamp].p, 
9780: 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
9790: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  es<0 ){.      iL
97a0: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
97b0: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
97c0: 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  + aSample[iSamp]
97d0: 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anEq[n-1];.    
97e0: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
97f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9800: 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65  res==0 && n<nFie
9810: 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  ld ){.      iLow
9820: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9830: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20  mp].anLt[n-1];. 
9840: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9850: 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  t+1;.      res =
9860: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
9870: 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
9880: 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f  iTest;.      iCo
9890: 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  l = n-1;.    }. 
98a0: 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
98b0: 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a  iMin<iSample );.
98c0: 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20    i = iSample / 
98d0: 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20  nField;..#ifdef 
98e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
98f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9900: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
9910: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
9920: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
9930: 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
9940: 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
9950: 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
9960: 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
9970: 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
9980: 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
9990: 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
99a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
99b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
99c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d   ){.    if( res=
99d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
99e0: 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
99f0: 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  ue, then pRec mu
9a00: 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  st be equal to s
9a10: 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20  ample i. */.    
9a20: 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
9a30: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
9a40: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
9a50: 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
9a60: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
9a70: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
9a80: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
9a90: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
9aa0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
9ab0: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
9ac0: 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20  pRec) .         
9ad0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9ae0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20  >mallocFailed . 
9af0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
9b00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65  e{.      /* Unle
9b10: 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  ss i==pIdx->nSam
9b20: 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ple, indicating 
9b30: 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72  that pRec is lar
9b40: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ger than.      *
9b50: 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  * all samples in
9b60: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9b70: 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20  rray, pRec must 
9b80: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
9b90: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43  the.      ** (iC
9ba0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
9bb0: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20  ix of sample i. 
9bc0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9bd0: 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i<=pIdx->nSamp
9be0: 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20  le && i>=0 );.  
9bf0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9c00: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20   = iCol+1;.     
9c10: 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
9c20: 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
9c30: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9c40: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9c50: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
9c60: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
9c70: 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  ec)>0.          
9c80: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9c90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9ca0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d  .      /* if i==
9cb0: 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74  0 and iCol==0, t
9cc0: 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20  hen record pRec 
9cd0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9ce0: 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20  all samples.    
9cf0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d    ** in the aSam
9d00: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68  ple[] array. Oth
9d10: 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c  erwise, if (iCol
9d20: 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75  >0) then pRec mu
9d30: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67  st.      ** be g
9d40: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9d50: 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f  qual to the (iCo
9d60: 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  l) field prefix 
9d70: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20  of sample i..   
9d80: 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20     ** If (i>0), 
9d90: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61  then pRec must a
9da0: 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74  lso be greater t
9db0: 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29  han sample (i-1)
9dc0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
9dd0: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
9de0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9df0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61   iCol;.        a
9e00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9e10: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9e20: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
9e30: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
9e40: 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )<=0.           
9e50: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9e60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9e80: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
9e90: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9ea0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20   nField;.       
9eb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ec0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9ed0: 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
9ee0: 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
9ef0: 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20  , pRec)<0.      
9f00: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9f10: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9f20: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
9f30: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
9f40: 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
9f50: 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72  EBUG */..  if( r
9f60: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
9f70: 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65  Record pRec is e
9f80: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
9f90: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9fa0: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
9fb0: 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
9fc0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
9fd0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
9fe0: 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
9ff0: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
a000: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74  }else{.    /* At
a010: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
a020: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
a030: 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c  prefix of aSampl
a040: 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
a050: 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  t .    ** sample
a060: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
a070: 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20   than pRec. Or, 
a080: 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
a090: 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20  ple then pRec.  
a0a0: 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74    ** is larger t
a0b0: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  han all samples 
a0c0: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f  in the array. */
a0d0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
a0e0: 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
a0f0: 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d  f( i>=pIdx->nSam
a100: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70  ple ){.      iUp
a110: 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
a120: 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
a130: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
a140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a150: 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
a160: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a170: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a180: 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
a190: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
a1a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a1b0: 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
a1c0: 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
a1d0: 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
a1e0: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
a1f0: 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
a200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
a210: 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
a220: 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
a230: 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
a240: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a250: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
a260: 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l];.  }..  /* Re
a270: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
a280: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
a290: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
a2a0: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
a2b0: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
a2c0: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
a2d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
a2e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a2f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
a300: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
a310: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
a320: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
a330: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
a340: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
a350: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
a360: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
a370: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
a380: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
a390: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
a3a0: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
a3b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a3c0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
a3d0: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
a3e0: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
a3f0: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
a400: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
a410: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
a420: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
a430: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
a440: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
a450: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
a460: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
a470: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
a480: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
a490: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
a4a0: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
a4b0: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
a4c0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
a4d0: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
a4e0: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
a4f0: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
a500: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
a510: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
a520: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
a530: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
a540: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
a550: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
a560: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
a570: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
a580: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
a590: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
a5a0: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
a5b0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
a5c0: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
a5d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
a5e0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
a5f0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
a600: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
a610: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
a620: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
a630: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
a640: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
a650: 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  Ret;.}...#ifdef 
a660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
a670: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
a680: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66  ** Return the af
a690: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e  finity for a sin
a6a0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  gle column of an
a6b0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
a6c0: 63 20 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e  c char sqlite3In
a6d0: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
a6e0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  y(sqlite3 *db, I
a6f0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
a700: 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28  iCol){.  assert(
a710: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
a720: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
a730: 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a  ;.  if( !pIdx->z
a740: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66  ColAff ){.    if
a750: 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  ( sqlite3IndexAf
a760: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49  finityStr(db, pI
a770: 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  dx)==0 ) return 
a780: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
a790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
a7a0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c  dx->zColAff[iCol
a7b0: 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  ];.}.#endif...#i
a7c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a7d0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
a7e0: 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
a7f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a800: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
a810: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
a820: 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
a830: 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
a840: 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
a850: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
a860: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
a870: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
a880: 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
a890: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
a8a0: 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
a8b0: 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
a8c0: 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
a8d0: 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
a8e0: 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
a8f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
a900: 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
a910: 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
a920: 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
a930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
a940: 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
a950: 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
a960: 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
a970: 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
a980: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
a990: 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
a9a0: 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
a9b0: 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
a9c0: 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
a9d0: 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
a9e0: 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
a9f0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
aa00: 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
aa10: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
aa20: 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
aa30: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
aa40: 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
aa50: 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
aa60: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
aa70: 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
aa80: 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
aa90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
aaa0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
aab0: 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
aac0: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
aad0: 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
aae0: 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
aaf0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ab00: 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
ab10: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
ab20: 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
ab30: 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
ab40: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
ab50: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
ab60: 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
ab70: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
ab80: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
ab90: 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
aba0: 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
abb0: 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
abc0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
abd0: 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
abe0: 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
abf0: 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
ac00: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
ac10: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
ac20: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
ac30: 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
ac40: 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
ac50: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
ac60: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
ac70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
ac80: 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
ac90: 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
aca0: 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
acb0: 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
acc0: 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
acd0: 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
ace0: 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
acf0: 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
ad00: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
ad10: 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
ad20: 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
ad30: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
ad40: 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
ad50: 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
ad60: 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
ad70: 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
ad80: 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
ad90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
ada0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
adb0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
adc0: 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
add0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
ade0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
adf0: 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
ae00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ae10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ae20: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
ae30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ae40: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
ae50: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
ae60: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
ae70: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
ae80: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
ae90: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
aea0: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
aeb0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
aec0: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
aed0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
aee0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
aef0: 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
af00: 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
af10: 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
af20: 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
af30: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
af40: 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
af50: 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
af60: 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
af70: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
af80: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
af90: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
afa0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
afb0: 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
afc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
afd0: 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
afe0: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
aff0: 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
b000: 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
b010: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66  LITE_OK;.  u8 af
b020: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
b030: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64  ColumnAffinity(d
b040: 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f  b, p, nEq);.  Co
b050: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
b060: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b070: 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
b080: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
b090: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
b0a0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
b0b0: 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
b0c0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b0d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
b0e0: 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
b0f0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
b100: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
b110: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
b120: 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
b130: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
b140: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
b150: 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
b160: 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
b170: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
b180: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
b190: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
b1a0: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
b1b0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
b1c0: 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
b1d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
b1e0: 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
b1f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
b200: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
b210: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
b220: 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
b230: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
b240: 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
b250: 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
b260: 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
b270: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
b280: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
b290: 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
b2a0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
b2b0: 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
b2c0: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
b2d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
b2e0: 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
b2f0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
b300: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
b310: 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
b320: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b330: 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
b340: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
b350: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
b360: 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
b370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
b380: 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
b390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b3a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b3b0: 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
b3c0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
b3d0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
b3e0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
b3f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
b400: 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
b410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b420: 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
b430: 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
b440: 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
b450: 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
b460: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
b470: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
b480: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
b490: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
b4a0: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
b4b0: 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
b4c0: 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
b4d0: 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
b4e0: 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
b4f0: 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
b500: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
b510: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
b520: 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
b530: 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
b540: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b550: 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
b560: 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
b570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b580: 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
b590: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
b5a0: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
b5b0: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
b5c0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
b5d0: 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
b5e0: 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
b5f0: 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
b600: 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
b610: 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
b620: 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
b630: 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
b640: 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
b650: 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
b660: 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
b670: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
b680: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
b690: 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
b6a0: 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
b6b0: 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
b6c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
b6f0: 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
b700: 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
b710: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
b720: 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
b730: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
b740: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
b750: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
b760: 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
b770: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
b780: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
b790: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b7a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
b7b0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
b7c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b7d0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
b7e0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
b7f0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
b800: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
b810: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
b820: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
b830: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
b840: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
b850: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
b860: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
b870: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
b880: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
b890: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
b8a0: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
b8b0: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
b8c0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
b8d0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
b8e0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
b8f0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
b900: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
b910: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
b920: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
b930: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
b940: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
b970: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b990: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
b9c0: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
b9d0: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
b9e0: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
b9f0: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
ba00: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
ba10: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
ba20: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
ba30: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
ba40: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
ba50: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
ba60: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
ba70: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ba80: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
ba90: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
baa0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
bab0: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
bac0: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
bad0: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
bae0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
baf0: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
bb00: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
bb10: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
bb20: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
bb30: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
bb40: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
bb50: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
bb60: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
bb70: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
bb80: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
bb90: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
bba0: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
bbb0: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
bbc0: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
bbd0: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
bbe0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
bbf0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
bc00: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
bc10: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
bc20: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
bc30: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
bc40: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
bc50: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
bc60: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
bc70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
bc80: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
bc90: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
bca0: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
bcb0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
bcc0: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
bcd0: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
bce0: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
bcf0: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
bd00: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
bd10: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
bd20: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
bd30: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
bd40: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
bd50: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
bd60: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
bd70: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
bd80: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
bd90: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
bda0: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
bdb0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
bdc0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
bdd0: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
bde0: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
bdf0: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
be00: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
be10: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
be20: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
be30: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
be40: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
be50: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
be60: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
be70: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
be80: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
be90: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
bea0: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
beb0: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
bec0: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
bed0: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
bee0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
bef0: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
bf00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bf10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
bf20: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
bf30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
bf40: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
bf50: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
bf60: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
bf70: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
bf80: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
bf90: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
bfa0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
bfb0: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
bfc0: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
bfd0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
bfe0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
bff0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
c000: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
c010: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
c020: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
c030: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
c040: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c050: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
c060: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
c070: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
c080: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c090: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
c0a0: 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
c0b0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
c0c0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
c0d0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
c0e0: 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
c0f0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
c100: 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
c110: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  ol ){.    if( nE
c120: 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
c130: 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
c140: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
c150: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
c160: 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
c170: 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
c180: 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20   u8 aff;..      
c190: 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
c1a0: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
c1b0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
c1c0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
c1d0: 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  rows in .      *
c1e0: 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
c1f0: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
c200: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
c210: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
c220: 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  y. The.      ** 
c230: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
c240: 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
c250: 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
c260: 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
c270: 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70  e.      ** key-p
c280: 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
c290: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
c2a0: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
c2b0: 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
c2c0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
c2d0: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
c2e0: 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61  and $L is the va
c2f0: 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20  lue in pLower.. 
c300: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c310: 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
c320: 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
c330: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
c340: 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
c350: 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  e it.      ** is
c360: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
c370: 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
c380: 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
c390: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
c3a0: 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
c3b0: 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
c3c0: 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
c3d0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c3e0: 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
c3f0: 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
c400: 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
c410: 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
c420: 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
c430: 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  ) and .      ** 
c440: 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
c450: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
c460: 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
c470: 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  s is used..     
c480: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d   **.      ** Sim
c490: 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
c4a0: 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
c4b0: 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
c4c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
c4d0: 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
c4e0: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
c4f0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
c500: 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
c510: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
c520: 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
c530: 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
c540: 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
c550: 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
c560: 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
c570: 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65       ** of iUppe
c580: 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
c590: 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
c5a0: 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
c5b0: 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  er used..      *
c5c0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
c5d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65  umber of rows be
c5e0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f  tween the two bo
c5f0: 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73  unds is then jus
c600: 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e  t iUpper-iLower.
c610: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c620: 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20  tRowcnt iLower; 
c630: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
c640: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c650: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74  bound */.      t
c660: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20  Rowcnt iUpper;  
c670: 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
c680: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
c690: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
c6a0: 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20  t iLwrIdx = -2; 
c6b0: 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
c6c0: 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  or the lower bou
c6d0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
c6e0: 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20  iUprIdx = -1;   
c6f0: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
c700: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c710: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70   */..      if( p
c720: 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rec ){.        t
c730: 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e  estcase( pRec->n
c740: 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d  Field!=pBuilder-
c750: 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  >nRecValid );.  
c760: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
c770: 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ld = pBuilder->n
c780: 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  RecValid;.      
c790: 7d 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  }.      aff = sq
c7a0: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
c7b0: 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2d  Affinity(pParse-
c7c0: 3e 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20  >db, p, nEq);.  
c7d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 21      assert( nEq!
c7e0: 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 61  =p->nKeyCol || a
c7f0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
c800: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
c810: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
c820: 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
c830: 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
c840: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  */.      if( nEq
c850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
c860: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
c870: 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e     iUpper = p->n
c880: 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d  RowEst0;.      }
c890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c8a0: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
c8b0: 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
c8c0: 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
c8d0: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
c8e0: 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a   must .        *
c8f0: 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  * have been requ
c900: 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69  ested when testi
c910: 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65  ng key $P in whe
c920: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29  reEqualScanEst()
c930: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
c940: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
c950: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
c960: 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77  a);.        iLow
c970: 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
c980: 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
c990: 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   + a[1];.      }
c9a0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
c9b0: 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c  pLower==0 || (pL
c9c0: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
c9d0: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
c9e0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
c9f0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
ca00: 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  | (pUpper->eOper
ca10: 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
ca20: 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
ca30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f    assert( p->aSo
ca40: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
ca50: 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74      if( p->aSort
ca60: 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20  Order[nEq] ){.  
ca70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c        /* The rol
ca80: 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64  es of pLower and
ca90: 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70   pUpper are swap
caa0: 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69  ped for a DESC i
cab0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
cac0: 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c  SWAP(WhereTerm*,
cad0: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29   pLower, pUpper)
cae0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
caf0: 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
cb00: 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
cb10: 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20  iLower estimate 
cb20: 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a  using ($P:$L). *
cb30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77  /.      if( pLow
cb40: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
cb50: 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
cb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb70: 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
cb80: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
cb90: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
cba0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
cbb0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
cbc0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
cbd0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
cbe0: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
cbf0: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
cc00: 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
cc10: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
cc20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cc30: 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
cc40: 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
cc50: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
cc60: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
cc70: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
cc80: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
cc90: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
cca0: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
ccb0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
ccc0: 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20  O_LE)) ? a[1] : 
ccd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
cce0: 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20  ( iNew>iLower ) 
ccf0: 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iLower = iNew;. 
cd00: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
cd10: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65  .          pLowe
cd20: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
cd30: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cd40: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
cd50: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
cd60: 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75  Upper estimate u
cd70: 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f  sing ($P:$U). */
cd80: 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65  .      if( pUppe
cd90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
cda0: 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
cdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cdc0: 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
cdd0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
cde0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
cdf0: 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65  r *pExpr = pUppe
ce00: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
ce10: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
ce20: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
ce30: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
ce40: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
ce50: 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b  , aff, nEq, &bOk
ce60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ce70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ce80: 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bOk ){.         
ce90: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
cea0: 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78           iUprIdx
ceb0: 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
cec0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
ced0: 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 1, a);.       
cee0: 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b     iNew = a[0] +
cef0: 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72   ((pUpper->eOper
cf00: 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
cf10: 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30  _LE)) ? a[1] : 0
cf20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
cf30: 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69   iNew<iUpper ) i
cf40: 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Upper = iNew;.  
cf50: 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a          nOut--;.
cf60: 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65 72            pUpper
cf70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
cf80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
cf90: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
cfa0: 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20  pRec;.      if( 
cfb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
cfc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55 70  .        if( iUp
cfd0: 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20  per>iLower ){.  
cfe0: 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
cff0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
d000: 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
d010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
d020: 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55 70  NG:  If both iUp
d030: 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20 61  per and iLower a
d040: 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  re derived from 
d050: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
d060: 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68     ** sample, th
d070: 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20 61  en assume they a
d080: 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65 63  re 4x more selec
d090: 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69 6e  tive.  This brin
d0a0: 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gs.          ** 
d0b0: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73 65  the estimated se
d0c0: 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20 69  lectivity more i
d0d0: 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61 74  n line with what
d0e0: 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 20   it would be.   
d0f0: 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73 74         ** if est
d100: 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20 74  imated without t
d110: 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33 2f  he use of STAT3/
d120: 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20  4 tables. */.   
d130: 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72 49         if( iLwrI
d140: 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e 4e  dx==iUprIdx ) nN
d150: 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65 72  ew -= 20;  asser
d160: 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
d170: 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 20  gEst(4) );.     
d180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d190: 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
d1a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
d1b0: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
d1c0: 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2) );.        }.
d1d0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77          if( nNew
d1e0: 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  <nOut ){.       
d1f0: 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a     nOut = nNew;.
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
d220: 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65  0, ("STAT4 range
d230: 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65   scan: %u..%u  e
d240: 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
d270: 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
d280: 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Out));.      }. 
d290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d2a0: 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20  int bDone = 0;. 
d2b0: 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
d2c0: 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
d2d0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20  pParse, pLower, 
d2e0: 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26  pUpper, pLoop, &
d2f0: 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  bDone);.      if
d300: 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  ( bDone ) return
d310: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
d320: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
d330: 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
d340: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d350: 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20  TER(pBuilder);. 
d360: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
d370: 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e  || pUpper );.#en
d380: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55  dif.  assert( pU
d390: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
d3a0: 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
d3b0: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
d3c0: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d3d0: 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72  ngeAdjust(pLower
d3e0: 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20  , nOut);.  nNew 
d3f0: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
d400: 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29  st(pUpper, nNew)
d410: 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ;..  /* TUNING: 
d420: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
d430: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
d440: 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65  wer limit and ne
d450: 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a  ither limit.  **
d460: 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61 74   has an applicat
d470: 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65  ion-defined like
d480: 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65  lihood(), assume
d490: 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20   the range is.  
d4a0: 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61 6e  ** reduced by an
d4b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e   additional 75%.
d4c0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
d4d0: 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e  , by default, an
d4e0: 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a   open-ended.  **
d4f0: 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e   range query (e.
d500: 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61  g. col > ?) is a
d510: 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20  ssumed to match 
d520: 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20  1/4 of the rows 
d530: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
d540: 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65  x. While a close
d550: 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f  d range (e.g. co
d560: 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
d570: 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  ?) is estimated 
d580: 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f  to.  ** match 1/
d590: 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  64 of the index.
d5a0: 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65   */ .  if( pLowe
d5b0: 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75  r && pLower->tru
d5c0: 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70 70  thProb>0 && pUpp
d5d0: 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74 72  er && pUpper->tr
d5e0: 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20  uthProb>0 ){.   
d5f0: 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d   nNew -= 20;.  }
d600: 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f  ..  nOut -= (pLo
d610: 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65  wer!=0) + (pUppe
d620: 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65  r!=0);.  if( nNe
d630: 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30  w<10 ) nNew = 10
d640: 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75  ;.  if( nNew<nOu
d650: 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b  t ) nOut = nNew;
d660: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
d670: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d680: 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f  .  if( pLoop->nO
d690: 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57  ut>nOut ){.    W
d6a0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
d6b0: 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65  "Range scan lowe
d6c0: 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20  rs nOut from %d 
d6d0: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
d6f0: 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29  oop->nOut, nOut)
d700: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
d710: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
d720: 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
d730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
d740: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d750: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
d760: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
d780: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
d790: 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
d7a0: 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
d7b0: 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
d7c0: 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
d7d0: 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
d7e0: 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
d7f0: 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
d800: 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
d810: 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
d820: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
d830: 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
d840: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
d850: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
d860: 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
d870: 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
d880: 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
d890: 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
d8a0: 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
d8b0: 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
d8c0: 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
d8d0: 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
d8e0: 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
d8f0: 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
d900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d910: 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
d920: 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
d930: 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
d940: 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
d950: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
d960: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
d970: 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
d980: 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
d990: 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
d9a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
d9b0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
d9c0: 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
d9d0: 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
d9e0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
d9f0: 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
da00: 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
da10: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
da20: 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
da30: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
da40: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
da50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
da60: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
da70: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
da80: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
da90: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
daa0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
dab0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
dac0: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
dad0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
dae0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
daf0: 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
db00: 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
db10: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
db20: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
db30: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
db40: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
db50: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
db60: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
db70: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
db80: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
db90: 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
dba0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
dbb0: 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
dbc0: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
dbd0: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
dbe0: 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
dbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
dc00: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
dc10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc30: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
dc40: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
dc50: 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
dc60: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
dc70: 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
dc80: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
dc90: 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
dca0: 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d  ( nEq<=p->nColum
dcb0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
dcc0: 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
dcd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
dce0: 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
dcf0: 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
dd00: 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a  ecValid<nEq );..
dd10: 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61    /* If values a
dd20: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
dd30: 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20   for all fields 
dd40: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
dd50: 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
dd60: 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73   this one, no es
dd70: 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61  timate can be ma
dd80: 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  de. Return SQLIT
dd90: 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20  E_NOTFOUND. */. 
dda0: 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e   if( pBuilder->n
ddb0: 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29  RecValid<(nEq-1)
ddc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ddd0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
dde0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
ddf0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
de00: 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c  n only. The call
de10: 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34   to sqlite3Stat4
de20: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a  ProbeSetValue().
de30: 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64    ** below would
de40: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
de50: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
de60: 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d  ( nEq>=p->nColum
de70: 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  n ){.    *pnRow 
de80: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
de90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
dea0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49    aff = sqlite3I
deb0: 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ndexColumnAffini
dec0: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
ded0: 2c 20 6e 45 71 2d 31 29 3b 0a 20 20 72 63 20 3d  , nEq-1);.  rc =
dee0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
def0: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
df00: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
df10: 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
df20: 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
df30: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
df40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
df50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
df60: 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
df70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
df80: 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
df90: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
dfa0: 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
dfb0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
dfc0: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
dfd0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
dfe0: 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
dff0: 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
e000: 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
e010: 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
e020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e030: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e040: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
e050: 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
e060: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e070: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
e080: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
e090: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
e0a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
e0b0: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
e0c0: 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
e0d0: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
e0e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
e0f0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
e100: 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
e110: 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
e120: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
e130: 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
e140: 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
e150: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
e160: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
e170: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
e180: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
e190: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
e1a0: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
e1b0: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
e1c0: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
e1d0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
e1e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e1f0: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
e200: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
e210: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e220: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
e230: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
e240: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
e250: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
e260: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
e270: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
e280: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
e290: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
e2a0: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
e2b0: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
e2c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
e2d0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
e2e0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
e2f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e300: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
e310: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
e320: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
e330: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
e340: 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
e350: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
e360: 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
e370: 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
e380: 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
e390: 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
e3a0: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
e3b0: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
e3c0: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
e3d0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
e3e0: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
e3f0: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
e400: 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
e410: 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
e420: 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
e430: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
e440: 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
e450: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e460: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
e470: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
e480: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
e490: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
e4a0: 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
e4b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e4c0: 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
e4d0: 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
e4e0: 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
e4f0: 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
e500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
e510: 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
e520: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e540: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e550: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
e560: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
e570: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e580: 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
e590: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
e5a0: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
e5b0: 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
e5c0: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
e5d0: 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
e5e0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
e5f0: 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
e600: 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
e610: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
e620: 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
e630: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
e640: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
e650: 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
e660: 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
e670: 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
e680: 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
e690: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
e6a0: 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
e6b0: 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f  : est=%d\n", nRo
e6c0: 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
e6d0: 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
e6e0: 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
e6f0: 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
e700: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
e710: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
e720: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
e730: 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
e740: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
e750: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e  ** Print the con
e760: 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54  tent of a WhereT
e770: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  erm object.*/.st
e780: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54  atic void whereT
e790: 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65  ermPrint(WhereTe
e7a0: 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69  rm *pTerm, int i
e7b0: 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
e7c0: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rm==0 ){.    sql
e7d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e7e0: 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c  "TERM-%-3d NULL\
e7f0: 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65  n", iTerm);.  }e
e800: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  lse{.    char zT
e810: 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  ype[4];.    memc
e820: 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
e830: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   4);.    if( pTe
e840: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
e850: 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
e860: 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20  pe[0] = 'V';.   
e870: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
e880: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
e890: 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
e8a0: 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  E';.    if( Expr
e8b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
e8c0: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
e8d0: 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
e8e0: 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c  ] = 'L';.    sql
e8f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e900: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
e910: 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d  3d %p %s cursor=
e920: 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f  %-3d prob=%-3d o
e930: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
e940: 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20 20  =0x%04x\n",.    
e950: 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c     iTerm, pTerm,
e960: 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c   zType, pTerm->l
e970: 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d  eftCursor, pTerm
e980: 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
e990: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
e9a0: 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46  ator, pTerm->wtF
e9b0: 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lags);.    sqlit
e9c0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
e9d0: 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
e9e0: 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  0);.  }.}.#endif
e9f0: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
ea00: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
ea10: 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
ea20: 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
ea30: 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
ea40: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
ea50: 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
ea60: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
ea70: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
ea80: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
ea90: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
eaa0: 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
eab0: 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
eac0: 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
ead0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
eae0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
eaf0: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
eb00: 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
eb10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
eb20: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
eb30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
eb40: 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
eb50: 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
eb80: 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
eb90: 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
eba0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ebb0: 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
ebe0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
ebf0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ec00: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
ec10: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
ec20: 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
ec30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ec40: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
ec50: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
ec60: 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
ec70: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
ec80: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
ec90: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
eca0: 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
ecb0: 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
ecc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
ecd0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ece0: 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
ecf0: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
ed00: 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
ed10: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
ed20: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
ed30: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ed40: 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
ed50: 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
ed60: 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
ed70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
ed80: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ed90: 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
eda0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
edb0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
edc0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
edd0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
ede0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
edf0: 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
ee20: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
ee30: 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
ee40: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
ee50: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
ee60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
ee70: 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
ee80: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
ee90: 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
eea0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
eeb0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
eec0: 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
eed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
eee0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
eef0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
ef00: 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
ef10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ef20: 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
ef30: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
ef40: 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
ef50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ef60: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ef70: 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
ef80: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
ef90: 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
efa0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
efb0: 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
efc0: 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
efd0: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
efe0: 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
eff0: 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
f000: 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
f010: 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
f020: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f030: 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
f040: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
f050: 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
f060: 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
f070: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
f080: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
f090: 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
f0a0: 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
f0b0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
f0c0: 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
f0d0: 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
f0e0: 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
f0f0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
f100: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
f110: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
f120: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
f130: 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
f140: 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
f150: 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
f160: 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
f170: 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
f180: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
f190: 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
f1a0: 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
f1b0: 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
f1c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f1d0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
f1e0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
f1f0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f200: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
f210: 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
f220: 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
f230: 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
f240: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
f250: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
f260: 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
f270: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
f280: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f290: 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
f2a0: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
f2b0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
f2c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
f2d0: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
f2e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f2f0: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
f300: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
f310: 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
f320: 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
f330: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f340: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
f350: 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
f360: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f370: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
f380: 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
f390: 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
f3a0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
f3b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
f3c0: 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
f3d0: 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
f3e0: 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
f3f0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f400: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
f410: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
f420: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
f430: 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
f440: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
f450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f460: 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
f470: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
f480: 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
f490: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
f4a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
f4b0: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
f4c0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
f4d0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
f4e0: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
f4f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
f500: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
f510: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f520: 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
f530: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
f540: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
f550: 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
f560: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
f570: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
f580: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
f590: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
f5a0: 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
f5b0: 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
f5c0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
f5d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
f5e0: 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
f5f0: 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
f600: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
f610: 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
f620: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
f630: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
f640: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
f650: 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
f660: 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
f670: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
f680: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
f6a0: 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
f6b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
f6c0: 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
f6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f6e0: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
f6f0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f700: 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
f710: 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
f720: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
f730: 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
f740: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
f750: 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
f760: 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
f770: 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
f780: 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
f790: 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
f7a0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f7b0: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
f7c0: 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
f7d0: 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
f7e0: 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
f7f0: 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
f800: 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
f810: 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
f820: 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
f830: 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
f840: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
f850: 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
f860: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
f870: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
f880: 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
f890: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
f8a0: 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
f8b0: 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
f8c0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
f8d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
f8f0: 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
f900: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f910: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
f920: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
f930: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f940: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
f950: 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
f960: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
f970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
f980: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
f990: 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
f9a0: 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
f9b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
f9c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f9d0: 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
f9e0: 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
f9f0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
fa00: 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
fa10: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
fa20: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
fa30: 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
fa40: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
fa50: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26  Level->pWLoop &&
fa60: 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
fa70: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
fa80: 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20  E_IN_ABLE) ){.  
fa90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
faa0: 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
fab0: 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
fac0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fad0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
fae0: 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
faf0: 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
fb00: 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
fb10: 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
fb20: 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
fb30: 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
fb40: 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
fb50: 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
fb60: 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
fb70: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
fb80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
fb90: 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
fba0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
fbb0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c  eturn TRUE if al
fbc0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
fbd0: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
fbe0: 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20  **   (1)  X has 
fbf0: 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
fc00: 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a  r cost that Y.**
fc10: 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70     (2)  X is a p
fc20: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
fc30: 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b  Y.**   (3)  X sk
fc40: 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20  ips at least as 
fc50: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20  many columns as 
fc60: 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70  Y.**.** By "prop
fc70: 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65  er subset" we me
fc80: 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66  an that X uses f
fc90: 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ewer WHERE claus
fca0: 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20  e terms.** than 
fcb0: 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
fcc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
fcd0: 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
fce0: 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20  also used.** by 
fcf0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  Y..**.** If X is
fd00: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
fd10: 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
fd20: 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
fd30: 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
fd40: 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
fd50: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
fd60: 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
fd70: 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
fd80: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
fd90: 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
fda0: 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
fdb0: 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72  ed.  The third r
fdc0: 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  ule.** was added
fdd0: 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
fde0: 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
fdf0: 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
fe00: 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
fe10: 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
fe20: 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
fe30: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
fe40: 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   Y..*/.static in
fe50: 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  t whereLoopCheap
fe60: 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a  erProperSubset(.
fe70: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
fe80: 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20  p *pX,       /* 
fe90: 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  First WhereLoop 
fea0: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
feb0: 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
fec0: 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *pY        /* Co
fed0: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68  mpare against th
fee0: 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  is WhereLoop */.
fef0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
ff00: 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d   if( pX->nLTerm-
ff10: 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d  pX->nSkip >= pY-
ff20: 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69  >nLTerm-pY->nSki
ff30: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
ff40: 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61  0; /* X is not a
ff50: 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a   subset of Y */.
ff60: 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53    }.  if( pY->nS
ff70: 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20  kip > pX->nSkip 
ff80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ff90: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59  ( pX->rRun >= pY
ffa0: 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66  ->rRun ){.    if
ffb0: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d  ( pX->rRun > pY-
ffc0: 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30  >rRun ) return 0
ffd0: 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
ffe0: 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
fff0: 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20     if( pX->nOut 
10000 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74  > pY->nOut ) ret
10010 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
10020 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
10030 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   */.  }.  for(i=
10040 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e  pX->nLTerm-1; i>
10050 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
10060 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  ( pX->aLTerm[i]=
10070 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10080 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54     for(j=pY->nLT
10090 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
100a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d  ){.      if( pY-
100b0 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e  >aLTerm[j]==pX->
100c0 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61  aLTerm[i] ) brea
100d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
100e0 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b   j<0 ) return 0;
100f0 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62    /* X not a sub
10100 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74  set of Y since t
10110 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65  erm X[i] not use
10120 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  d by Y */.  }.  
10130 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
10140 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
10150 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
10160 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
10170 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
10180 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
10190 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
101a0 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
101b0 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
101c0 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
101d0 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
101e0 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
101f0 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
10200 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
10210 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
10220 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
10230 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
10240 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
10250 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
10260 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
10270 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10280 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
10290 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
102a0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
102b0 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
102c0 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
102d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
102e0 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
102f0 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
10300 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
10310 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
10320 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
10330 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10340 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
10350 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10360 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
10370 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
10380 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
10390 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
103a0 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
103b0 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
103c0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
103d0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
103e0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
103f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
10400 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
10410 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
10420 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10430 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
10440 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10450 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
10460 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
10470 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
10480 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
10490 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
104a0 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
104b0 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
104c0 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
104d0 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
104e0 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
104f0 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
10500 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10510 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
10520 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
10530 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
10540 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
10550 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
10560 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
10570 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
10580 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
10590 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
105a0 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
105b0 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
105c0 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
105d0 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
105e0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
105f0 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
10600 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
10610 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
10620 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
10630 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
10640 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
10650 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
10660 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
10670 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
10680 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
106b0 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
106c0 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
106d0 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
106e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
106f0 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
10700 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10710 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
10720 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
10730 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
10740 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
10750 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
10760 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
10770 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
10780 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54  supplanted by pT
10790 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  emplate..**.** R
107a0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
107b0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74  e WhereLoop list
107c0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74   contains an ent
107d0 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70  ry that can supp
107e0 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74  lant.** pTemplat
107f0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
10800 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64  s if pTemplate d
10810 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f  oes not belong o
10820 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
10830 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
10840 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
10850 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61  plate can suppla
10860 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  nt, then return 
10870 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
10880 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
10890 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
108a0 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e  e cannot supplan
108b0 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  t any existing e
108c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
108d0 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20  st but needs.** 
108e0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
108f0 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65  he list, then re
10900 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
10910 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  o the tail of th
10920 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
10930 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
10940 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
10950 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
10960 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
10970 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
10980 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
10990 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
109a0 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
109b0 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
109c0 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
109d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
109e0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
109f0 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
10a00 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
10a10 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
10a20 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
10a30 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
10a40 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
10a50 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
10a60 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
10a70 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
10a80 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
10a90 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
10aa0 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
10ab0 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
10ac0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
10ad0 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
10ae0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
10af0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
10b00 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
10b10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
10b20 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
10b30 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
10b40 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
10b50 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
10b60 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
10b70 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
10b80 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
10b90 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
10ba0 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
10bb0 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
10bc0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
10bd0 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
10be0 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
10bf0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
10c00 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
10c10 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
10c20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
10c30 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
10c40 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
10c50 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
10c60 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
10c70 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
10c80 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
10c90 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
10ca0 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
10cb0 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
10cc0 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
10cd0 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
10ce0 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
10cf0 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
10d00 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
10d10 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
10d20 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
10d30 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
10d40 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
10d50 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
10d60 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
10d70 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
10d80 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
10d90 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
10da0 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
10db0 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
10dc0 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
10dd0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
10de0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10df0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
10e00 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10e10 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
10e20 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10e30 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10e40 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
10e50 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10e60 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10e70 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
10e80 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
10e90 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
10ea0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
10eb0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
10ec0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
10ed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10ee0 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
10ef0 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
10f00 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
10f10 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
10f20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
10f30 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
10f40 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
10f50 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
10f60 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
10f70 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
10f80 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
10f90 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
10fa0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
10fb0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
10fc0 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
10fd0 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
10fe0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
10ff0 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
11000 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
11010 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
11020 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
11030 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
11040 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
11050 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
11060 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
11090 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
110a0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
110b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
110c0 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
110d0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
110e0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
110f0 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
11100 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
11110 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
11120 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
11130 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
11140 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
11150 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
11160 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
11170 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
11180 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
11190 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
111a0 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
111b0 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
111c0 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
111d0 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
111e0 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
111f0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
11200 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
11210 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
11220 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
11230 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
11240 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
11250 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
11260 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
11270 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11290 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
112a0 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
112b0 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
112e0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
112f0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
11300 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
11310 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
11320 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
11330 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
11340 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
11350 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
11360 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
11370 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11380 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
11390 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
113a0 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
113b0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
113c0 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
113d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
113e0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
113f0 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
11400 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
11410 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
11420 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
11430 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
11440 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
11450 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
11460 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
11470 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
11480 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
11490 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
114a0 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
114b0 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
114c0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
114d0 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
114e0 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
114f0 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
11500 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
11510 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
11520 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11530 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
11540 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
11550 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
11560 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
11570 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
11580 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
11590 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
115a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
115b0 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
115c0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
115d0 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
115e0 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
115f0 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
11600 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
11610 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
11620 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
11630 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
11640 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
11650 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
11660 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
11670 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
11680 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
11690 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
116a0 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
116b0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
116c0 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
116d0 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
116e0 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
116f0 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
11700 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
11710 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
11720 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
11730 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
11740 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11750 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
11760 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
11770 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
11780 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
11790 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
117a0 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
117b0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
117c0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
117d0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
117e0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
117f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11800 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
11810 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11820 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
11830 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
11840 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
11850 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
11860 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
11870 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
11880 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
11890 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
118a0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
118b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
118c0 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
118d0 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
118e0 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
118f0 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
11900 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
11910 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
11920 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
11930 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b  plate->nLTerm ){
11940 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11950 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31  ENABLED.      u1
11960 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
11970 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20  pOrSet->n;.     
11980 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
11990 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
119a0 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f  ert(pBuilder->pO
119b0 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rSet, pTemplate-
119c0 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61  >prereq, pTempla
119d0 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20  te->rRun,.      
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
11a00 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a  emplate->nOut);.
11a10 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11a20 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
11a30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11a40 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
11a50 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
11a60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11a70 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
11a80 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
11a90 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
11aa0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
11ab0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
11ac0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
11ad0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  dif.    }.    re
11ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11af0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
11b00 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
11b10 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
11b20 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
11b30 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
11b40 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
11b50 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
11b60 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
11b70 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
11b80 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
11b90 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
11ba0 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
11bb0 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
11bc0 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
11bd0 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
11be0 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
11bf0 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
11c00 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
11c10 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
11c20 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
11c30 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11c40 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
11c50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11c60 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
11c70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11c80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11c90 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
11ca0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
11cb0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
11cc0 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
11cd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
11cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
11d00 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
11d10 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
11d20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
11d30 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
11d40 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
11d50 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
11d60 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
11d70 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
11d80 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
11d90 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
11da0 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
11db0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
11dc0 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
11dd0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
11de0 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
11df0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
11e00 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
11e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11e20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
11e30 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
11e40 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11e50 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
11e60 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WC);.    }.    s
11e70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
11e80 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a  f("    add: ");.
11e90 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11ea0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
11eb0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
11ec0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
11ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  ==0 ){.    /* Al
11ee0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
11ef0 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f  reLoop to add to
11f00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11f10 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50  list */.    *ppP
11f20 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  rev = p = sqlite
11f30 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
11f40 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
11f50 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
11f60 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
11f70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
11f80 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
11f90 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
11fa0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11fb0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
11fc0 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
11fd0 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
11fe0 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
11ff0 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
12000 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
12010 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
12020 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
12030 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
12040 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
12050 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
12060 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
12070 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
12080 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
12090 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
120a0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
120b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
120c0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
120d0 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
120e0 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
120f0 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
12100 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
12110 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12120 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
12130 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
12140 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
12150 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
12160 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
12170 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
12180 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
12190 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
121a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
121b0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
121c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
121d0 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
121e0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
121f0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
12200 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12210 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
12220 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
12230 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
12240 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
12250 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
12260 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
12270 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
12280 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
12290 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
122a0 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
122b0 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
122c0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
122d0 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
122e0 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
122f0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
12300 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
12310 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
12330 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
12340 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
12350 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
12360 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
12370 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
12380 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
12390 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
123a0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
123b0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
123c0 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
123d0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
123e0 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
123f0 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
12400 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
12410 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
12420 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
12430 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
12440 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
12450 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
12460 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
12470 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
12480 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
12490 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
124a0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
124b0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
124c0 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
124d0 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
124e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
124f0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
12500 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
12510 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
12520 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
12530 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
12540 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
12550 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
12560 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
12570 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
12580 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12590 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
125a0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
125b0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
125c0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
125d0 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
125e0 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
125f0 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
12600 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
12610 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12620 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
12630 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
12640 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
12650 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
12660 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
12670 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
12680 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
12690 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
126a0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
126b0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
126c0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
126d0 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
126e0 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
126f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12700 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
12710 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
12720 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
12730 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
12740 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
12750 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
12760 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
12770 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
12780 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
12790 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
127a0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
127b0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
127c0 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
127d0 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
127e0 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
127f0 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
12800 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
12810 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
12820 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
12830 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
12840 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
12850 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
12860 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
12870 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
12880 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
12890 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
128a0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
128b0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
128c0 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
128d0 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
128e0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
128f0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
12900 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
12910 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
12920 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12930 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
12940 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
12950 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
12960 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
12970 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
12980 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12990 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
129a0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
129b0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
129c0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
129d0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
129e0 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
129f0 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
12a00 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
12a10 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
12a20 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
12a30 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
12a40 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
12a50 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
12a60 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
12a70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
12a80 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
12a90 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
12aa0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
12ab0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
12ac0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
12ad0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
12ae0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
12af0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
12b00 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
12b10 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
12b20 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
12b30 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
12b40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
12b50 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
12b60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12b70 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
12b80 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
12b90 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
12ba0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
12bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
12bc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12bd0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
12be0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
12bf0 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
12c00 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
12c10 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
12c20 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
12c30 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
12c40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
12c50 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
12c60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
12c70 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
12c80 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
12c90 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
12ca0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
12cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
12cc0 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
12cd0 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
12ce0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
12cf0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
12d00 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
12d10 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
12d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d30 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
12d40 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
12d50 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12d60 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
12d70 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
12d80 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
12d90 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
12da0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
12db0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
12dc0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
12dd0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
12de0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
12df0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
12e00 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
12e10 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
12e20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
12e30 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
12e40 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
12e50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12e60 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12e70 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
12e80 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
12e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12ea0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
12eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12ec0 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
12ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ee0 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
12ef0 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
12f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12f10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
12f20 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
12f30 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
12f40 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
12f50 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
12f60 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
12f70 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
12f80 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
12f90 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
12fa0 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
12fb0 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
12fc0 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
12fd0 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
12fe0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
12ff0 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
13000 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
13010 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
13020 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
13030 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
13040 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
13050 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
13060 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
13070 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
13080 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
13090 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
130a0 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
130b0 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
130c0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
130d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
130e0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
130f0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
13100 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
13110 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
13120 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
13130 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
13140 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
13150 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
13160 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
13170 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
13180 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
13190 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
131a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
131b0 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
131c0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
131d0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
131e0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
131f0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13200 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
13210 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
13220 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
13230 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
13240 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
13250 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
13260 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
13270 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
13280 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
13290 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
132a0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
132b0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
132e0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
132f0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
13300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
13310 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
13320 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
13330 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
13340 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
13350 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
13360 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
13370 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
13380 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
13390 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
133a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
133b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
133c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
133d0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
133e0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
133f0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
13400 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13410 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
13420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
13430 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
13440 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
13450 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
13460 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
13470 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
13480 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
13490 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
134a0 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134c0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
134d0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
134e0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
134f0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
13500 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13510 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
13520 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
13530 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
13540 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13550 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13560 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
13570 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13590 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
135a0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
135b0 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
135c0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
135d0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
135e0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
135f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
13600 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
13610 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13620 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13630 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
13640 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
13650 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
13660 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13670 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13680 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
13690 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
136a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
136b0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
136c0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
136d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
136e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
136f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
13700 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
13710 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
13720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13730 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
13740 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
13750 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13770 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
13780 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
13790 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
137a0 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
137b0 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
137c0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
137d0 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
137e0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
137f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13800 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
13810 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
13820 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
13830 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
13840 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
13850 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
13860 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
13870 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
13880 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
13890 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
138a0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
138b0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
138c0 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
138d0 66 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e 75  f( /*pProbe->tnu
138e0 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72 63 2d  m<=0 ||*/ (pSrc-
138f0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
13900 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
13910 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
13920 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
13930 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
13940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d    }else{.    opM
13950 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
13960 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
13970 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e  _LT|WO_LE|WO_ISN
13980 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20  ULL|WO_IS;.  }. 
13990 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
139a0 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
139b0 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
139c0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
139d0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
139e0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
139f0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  obe->nColumn );.
13a00 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
13a10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13a20 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
13a30 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20  = pNew->nSkip;. 
13a40 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20   saved_nLTerm = 
13a50 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20  pNew->nLTerm;.  
13a60 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20  saved_wsFlags = 
13a70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  pNew->wsFlags;. 
13a80 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20   saved_prereq = 
13a90 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20  pNew->prereq;.  
13aa0 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65  saved_nOut = pNe
13ab0 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d  w->nOut;.  pTerm
13ac0 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
13ad0 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72  (&scan, pBuilder
13ae0 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75  ->pWC, pSrc->iCu
13af0 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c  rsor, saved_nEq,
13b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13b10 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
13b20 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77   pProbe);.  pNew
13b30 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
13b40 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
13b50 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
13b60 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
13b70 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f  Log(rSize);.  fo
13b80 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
13b90 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
13ba0 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
13bb0 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
13bc0 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
13bd0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
13be0 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
13bf0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13c00 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
13c10 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
13c20 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
13c30 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
13c40 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
13c50 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
13c60 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
13c70 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
13c80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13c90 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
13ca0 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
13cb0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
13cc0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
13cd0 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
13ce0 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
13cf0 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
13d00 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
13d10 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
13d20 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65  ull(pProbe, save
13d30 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  d_nEq).    ){.  
13d40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
13d50 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
13d60 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
13d70 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
13d80 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
13d90 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
13da0 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
13db0 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
13dc0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
13dd0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
13de0 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61  upper bound of a
13df0 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
13e00 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
13e10 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69  int.    ** to mi
13e20 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72  x with a lower r
13e30 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20  ange bound from 
13e40 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63  some other sourc
13e50 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  e */.    if( pTe
13e60 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13e70 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54  RM_LIKEOPT && pT
13e80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
13e90 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65  WO_LT ) continue
13ea0 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ;..    pNew->wsF
13eb0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
13ec0 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
13ed0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
13ee0 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
13ef0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
13f00 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
13f10 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
13f20 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
13f30 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
13f40 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
13f50 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
13f60 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
13f70 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
13f80 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
13f90 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
13fa0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
13fb0 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
13fc0 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
13fd0 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
13fe0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
13ff0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14000 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
14010 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
14020 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14030 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
14040 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
14050 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14060 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
14070 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
14080 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
14090 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
140a0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
140b0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
140c0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
140d0 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28  MN_IN;.      if(
140e0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
140f0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
14100 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
14110 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
14120 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47  T ...)":  TUNING
14130 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  : the SELECT ret
14140 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
14150 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36          nIn = 46
14160 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
14170 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
14180 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
14190 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
141a0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
141b0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
141c0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
141d0 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
141e0 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
141f0 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71          nIn = sq
14200 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70  lite3LogEst(pExp
14210 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
14220 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14230 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20    assert( nIn>0 
14240 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79  );  /* RHS alway
14250 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20  s has 2 or more 
14260 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61  terms...  The pa
14270 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  rser.           
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
14290 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f  changes "x IN (?
142a0 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a  )" into "x=?". *
142b0 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  /..    }else if(
142c0 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f   eOp & (WO_EQ|WO
142d0 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  _IS) ){.      in
142e0 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d  t iCol = pProbe-
142f0 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
14300 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  nEq];.      pNew
14310 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14320 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
14330 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65      assert( save
14340 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62  d_nEq==pNew->u.b
14350 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20  tree.nEq );.    
14360 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
14370 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  OWID .       || 
14380 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75  (iCol>0 && nInMu
14390 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45  l==0 && saved_nE
143a0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
143b0 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  ol-1).      ){. 
143c0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
143d0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e  =0 && pProbe->un
143e0 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  iqNotNull==0 ){.
143f0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
14400 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14410 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
14420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14430 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14440 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
14450 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
14460 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14470 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
14480 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
14490 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
144a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
144b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
144c0 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
144d0 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
144e0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
144f0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
14500 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
14510 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
14520 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14530 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
14540 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
14550 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
14560 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
14570 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
14580 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
14590 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
145a0 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
145b0 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
145c0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
145d0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
145e0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
145f0 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
14600 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
14610 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
14620 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14630 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
14640 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
14650 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
14660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
14670 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
14680 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
14690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
146a0 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
146b0 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
146c0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
146d0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
146e0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
146f0 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
14700 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
14710 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
14720 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
14730 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14740 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
14750 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a  _LIMIT;.      }.
14760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14770 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
14780 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
14790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
147a0 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
147b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
147c0 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
147d0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
147e0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
147f0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
14800 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
14810 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
14820 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
14830 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14840 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
14850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14860 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
14870 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
14880 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
14890 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
148a0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
148b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
148c0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
148d0 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
148e0 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
148f0 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
14900 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
14910 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
14920 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
14930 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
14940 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
14950 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
14960 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
14970 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
14980 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
14990 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
149a0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
149b0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
149c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
149d0 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
149e0 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
149f0 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
14a00 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14a10 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14a20 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
14a30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14a40 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
14a50 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
14a60 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
14a70 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
14a80 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
14a90 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
14aa0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
14ab0 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
14ac0 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
14ad0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
14ae0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14af0 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
14b00 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
14b10 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
14b20 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
14b30 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
14b40 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
14b50 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
14b60 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
14b70 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
14b80 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
14b90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
14ba0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
14bb0 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
14bc0 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
14bd0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
14be0 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
14bf0 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
14c00 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
14c10 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
14c20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
14c30 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
14c40 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
14c50 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
14c60 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
14c70 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
14c80 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14c90 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
14ca0 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
14cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
14cc0 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
14cd0 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
14ce0 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
14cf0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14d00 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
14d10 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
14d20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
14d30 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
14d40 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
14d50 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
14d60 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
14d70 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
14d80 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
14d90 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
14da0 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
14db0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
14dc0 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
14dd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14de0 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
14df0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14e00 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
14e10 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
14e20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14e30 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
14e40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
14e50 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
14e60 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14e70 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
14e80 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
14e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14ea0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14eb0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
14ec0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14ed0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
14ee0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
14ef0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
14f00 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14f10 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14f20 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
14f30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14f40 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
14f50 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
14f60 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
14f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14f80 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
14f90 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14fa0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14fb0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
14fc0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
14fd0 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
14fe0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
14ff0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
15000 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
15010 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
15020 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15030 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
15040 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
15050 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
15060 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
15070 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
15080 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
15090 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
150a0 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
150b0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
150c0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
150d0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
150e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
150f0 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
15100 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
15110 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
15120 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
15130 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
15140 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
15150 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
15160 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
15170 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
15180 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
15190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
151a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
151b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
151c0 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
151d0 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
151e0 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
151f0 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
15200 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
15210 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
15220 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
15230 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
15240 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
15250 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
15260 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
15270 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
15280 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
15290 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
152a0 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
152b0 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
152c0 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
152d0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
152e0 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
152f0 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
15300 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
15310 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
15320 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
15330 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
15340 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
15350 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
15360 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
15370 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
15380 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
15390 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
153a0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
153b0 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
153c0 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
153d0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
153e0 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
153f0 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
15400 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
15410 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
15420 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
15430 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
15440 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
15450 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
15460 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
15470 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
15480 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
15490 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
154a0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
154b0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
154c0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
154d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
154e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
154f0 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
15500 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15510 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
15520 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15530 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
15540 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
15550 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15560 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
15570 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
15580 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
15590 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
155a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
155b0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
155c0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
155d0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
155e0 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
155f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15600 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
15610 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15620 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15630 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
15640 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
15650 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
15660 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
15670 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
15680 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15690 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
156a0 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
156b0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
156c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
156d0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
156e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
156f0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
15700 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
15710 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
15720 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
15730 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
15740 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
15750 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
15760 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
15770 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
15780 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
15790 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
157a0 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
157b0 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
157c0 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
157d0 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
157e0 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
157f0 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
15800 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
15810 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
15820 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
15830 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
15840 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
15850 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
15860 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
15870 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
15880 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
15890 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
158a0 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
158b0 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
158c0 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
158d0 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
158e0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
158f0 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
15900 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
15910 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
15920 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
15930 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
15940 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
15950 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
15960 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
15970 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
15980 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
15990 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
159a0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
159b0 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
159c0 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
159d0 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
159e0 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
159f0 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
15a00 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15a10 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
15a20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
15a30 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
15a40 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
15a50 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
15a60 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
15a70 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
15a80 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
15a90 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
15aa0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
15ab0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
15ac0 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
15ad0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
15ae0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
15af0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
15b00 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
15b10 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
15b20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
15b30 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
15b40 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
15b50 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
15b60 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
15b70 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
15b80 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
15b90 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
15ba0 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
15bb0 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
15bc0 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
15bd0 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
15be0 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
15bf0 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
15c00 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
15c10 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
15c20 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
15c30 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15c40 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
15c50 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
15c60 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
15c70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
15c80 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
15c90 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
15ca0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
15cb0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
15cc0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
15cd0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
15ce0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
15cf0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
15d00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
15d10 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
15d20 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
15d30 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
15d40 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
15d50 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
15d60 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
15d70 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
15d80 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
15d90 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
15da0 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
15db0 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
15dc0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
15dd0 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
15de0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
15df0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
15e00 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
15e10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15e20 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
15e30 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
15e40 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
15e50 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
15e60 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
15e70 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
15e80 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45  prList *pOB;.  E
15e90 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70  xprList *aColExp
15ea0 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  r;.  int ii, jj;
15eb0 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
15ec0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
15ed0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
15ee0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
15ef0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
15f00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15f10 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
15f20 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
15f30 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
15f40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
15f50 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
15f60 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
15f70 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
15f80 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
15f90 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
15fa0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sor ){.      if(
15fb0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
15fc0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
15fd0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
15fe0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
15ff0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
16000 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
16010 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43  umn==pIndex->aiC
16020 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75  olumn[jj] ) retu
16030 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
16040 20 20 7d 65 6c 73 65 20 69 66 28 20 28 61 43 6f    }else if( (aCo
16050 6c 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  lExpr = pIndex->
16060 61 43 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a  aColExpr)!=0 ){.
16070 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
16080 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
16090 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
160a0 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
160b0 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f  iColumn[jj]!=XN_
160c0 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
160d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
160e0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
160f0 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e  pExpr,aColExpr->
16100 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  a[jj].pExpr,iCur
16110 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sor)==0 ){.     
16120 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
16130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16150 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16160 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
16170 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
16180 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
16190 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
161a0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
161b0 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
161c0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
161d0 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
161e0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
161f0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
16200 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
16210 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
16220 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
16230 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
16240 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
16250 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
16260 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
16270 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
16280 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
16290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
162a0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
162b0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
162c0 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
162d0 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
162e0 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
162f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
16300 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
16310 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
16320 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
16330 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
16340 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
16350 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
16360 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
16370 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
16380 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
16390 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
163a0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
163b0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
163c0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
163d0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
163e0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
163f0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69  rm *pTerm;.  whi
16400 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
16410 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66  TK_AND ){.    if
16420 28 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  ( !whereUsablePa
16430 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c  rtialIndex(iTab,
16440 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66  pWC,pWhere->pLef
16450 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
16460 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65     pWhere = pWhe
16470 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a  re->pRight;.  }.
16480 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
16490 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
164a0 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
164b0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
164c0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
164d0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
164e0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
164f0 45 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65  Expr(pExpr, pWhe
16500 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20  re, iTab) .     
16510 26 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70  && (!ExprHasProp
16520 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
16530 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70  romJoin) || pExp
16540 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
16550 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b  le==iTab).    ){
16560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
16570 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16580 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16590 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
165a0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
165b0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
165c0 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74  the join where t
165d0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69  he table.** is i
165e0 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c  denfied by pBuil
165f0 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
16600 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
16610 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
16620 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
16630 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
16640 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
16650 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c  he costs (WhereL
16660 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65  oop.rRun) of the
16670 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64   b-tree loops ad
16680 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ded by this func
16690 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63  tion.** are calc
166a0 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
166b0 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66  s:.**.** For a f
166c0 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69  ull scan, assumi
166d0 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72  ng the table (or
166e0 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73   index) contains
166f0 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a   nRow rows:.**.*
16700 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
16710 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20  w * 3.0         
16720 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75             // fu
16730 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll-table scan.**
16740 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
16750 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20   * K            
16760 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
16770 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e  n of covering in
16780 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
16790 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29  = nRow * (K+3.0)
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63  // scan of non-c
167c0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
167d0 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61  .** where K is a
167e0 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
167f0 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62  .1 and 3.0 set b
16800 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61  ased on the rela
16810 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74  tive .** estimat
16820 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  ed average size 
16830 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
16840 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a   table records..
16850 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64  **.** For an ind
16860 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e  ex scan, where n
16870 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d  Visit is the num
16880 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77  ber of index row
16890 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  s visited.** by 
168a0 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53  the scan, and nS
168b0 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65  eek is the numbe
168c0 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74  r of seek operat
168d0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e  ions required on
168e0 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62   .** the index b
168f0 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  -tree:.**.**    
16900 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
16910 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a  (log(nRow) + K *
16920 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20   nVisit)        
16930 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e    // covering in
16940 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
16950 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
16960 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a  Row) + (K+3.0) *
16970 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e   nVisit)    // n
16980 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
16990 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  x.**.** Normally
169a0 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53  , nSeek is 1. nS
169b0 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74  eek values great
169c0 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61  er than 1 come a
169d0 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20  bout if the .** 
169e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63  WHERE clause inc
169f0 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e  ludes "x IN (...
16a00 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69  .)" terms used i
16a10 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22  n place of "x=?"
16a20 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d  . Or when .** im
16a30 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45  plicit "x IN (SE
16a40 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29  LECT x FROM tbl)
16a50 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  " terms are adde
16a60 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73  d for skip-scans
16a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
16a80 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52  mated values (nR
16a90 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65  ow, nVisit, nSee
16aa0 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e  k) often contain
16ab0 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a   a large amount.
16ac0 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74  ** of uncertaint
16ad0 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  y.  For this rea
16ae0 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20  son, scoring is 
16af0 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b  designed to pick
16b00 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22   plans that.** "
16b10 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72  do the least har
16b20 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61  m" if the estima
16b30 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61  tes are inaccura
16b40 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  te.  For example
16b50 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29  , a.** log(nRow)
16b60 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74   factor is omitt
16b70 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f  ed from a non-co
16b80 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
16b90 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a  n in order to.**
16ba0 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e   bias the scorin
16bb0 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73  g in favor of us
16bc0 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69  ing an index, si
16bd0 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61  nce the worst-ca
16be0 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  se.** performanc
16bf0 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  e of using an in
16c00 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65  dex is far bette
16c10 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74  r than the worst
16c20 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63  -case performanc
16c30 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74  e.** of a full t
16c40 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74  able scan..*/.st
16c50 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
16c60 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
16c70 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
16c80 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
16c90 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
16ca0 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
16cb0 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
16cc0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
16cd0 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
16ce0 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
16cf0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
16d00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
16d10 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
16d20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
16d30 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
16d40 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
16d50 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
16d60 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
16d70 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
16da0 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
16db0 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
16dc0 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74   LogEst aiRowEst
16dd0 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20  Pk[2];       /* 
16de0 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b  The aiRowLogEst[
16df0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
16e00 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
16e10 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  16 aiColumnPk = 
16e20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
16e30 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
16e40 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
16e50 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
16e60 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
16e70 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
16e80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
16e90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
16ea0 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
16eb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
16ec0 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
16ed0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
16ee0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
16ef0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
16f00 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
16f10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16f20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
16f30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
16f40 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
16f50 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
16f60 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
16f70 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f90 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
16fa0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
16fb0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
16fc0 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
16fd0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
16fe0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
16ff0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
17000 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
17010 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
17020 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
17030 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
17040 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
17050 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64     /* The parsed
17060 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
17070 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
17080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17090 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
170a0 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e  eried */.  .  pN
170b0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
170c0 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
170d0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
170e0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
170f0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
17100 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
17110 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
17120 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  ab;.  pTab = pSr
17130 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d  c->pTab;.  pWC =
17140 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
17150 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
17160 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
17170 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
17180 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20  >pIBIndex ){.   
17190 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
171a0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
171b0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
171c0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
171d0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
171e0 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d  c->pIBIndex;.  }
171f0 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77  else if( !HasRow
17200 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
17210 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70  pProbe = pTab->p
17220 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
17230 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
17240 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
17250 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
17260 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
17270 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
17280 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
17290 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
172a0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
172b0 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
172c0 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
172d0 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
172e0 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
172f0 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
17300 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
17310 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
17320 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
17330 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
17360 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
17370 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
17380 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
17390 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
173a0 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20    sPk.nKeyCol = 
173b0 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  1;.    sPk.nColu
173c0 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
173d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
173e0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
173f0 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69  aiRowLogEst = ai
17400 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
17410 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
17420 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
17430 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
17440 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20     sPk.szIdxRow 
17450 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  = pTab->szTabRow
17460 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
17470 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
17480 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  LogEst;.    aiRo
17490 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20  wEstPk[1] = 0;. 
174a0 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
174b0 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
174c0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67      if( pSrc->fg
174d0 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
174e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
174f0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
17500 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
17510 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
17520 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
17530 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
17540 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
17550 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
17560 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
17570 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
17580 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
17590 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
175a0 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  Size = pTab->nRo
175b0 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53  wLogEst;.  rLogS
175c0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
175d0 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ze);..#ifndef SQ
175e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
175f0 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41  TIC_INDEX.  /* A
17600 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
17610 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
17620 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20  der->pOrSet     
17630 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20   /* Not part of 
17640 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  an OR optimizati
17650 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49  on */.   && (pWI
17660 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17670 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49  & WHERE_NO_AUTOI
17680 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28  NDEX)==0.   && (
17690 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
176a0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
176b0 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
176c0 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42  .   && pSrc->pIB
176d0 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a  Index==0      /*
176e0 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20   Has no INDEXED 
176f0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
17700 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74  && !pSrc->fg.not
17710 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73  Indexed   /* Has
17720 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   no NOT INDEXED 
17730 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
17740 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 20  HasRowid(pTab)  
17750 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49         /* Not WI
17760 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
17770 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e  e. (FIXME: Why n
17780 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70  ot?) */.   && !p
17790 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  Src->fg.isCorrel
177a0 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f  ated /* Not a co
177b0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
177c0 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  y */.   && !pSrc
177d0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
177e0 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72    /* Not a recur
177f0 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  sive common tabl
17800 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  e expression. */
17810 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
17820 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
17830 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
17840 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
17850 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
17860 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
17870 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
17880 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
17890 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
178a0 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
178b0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
178c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
178d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
178e0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
178f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17900 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
17910 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
17920 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
17930 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
17940 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
17950 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
17960 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17970 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
17980 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
17990 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
179a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
179b0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
179c0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
179d0 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
179e0 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
179f0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
17a00 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
17a10 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
17a20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  X*N*log2(N) wher
17a30 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
17a40 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
17a50 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
17a60 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
17a70 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37  and where X is 7
17a80 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72   (LogEst=28) for
17a90 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20   normal.        
17aa0 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33  ** tables or 1.3
17ab0 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f  75 (LogEst=4) fo
17ac0 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
17ad0 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c  ueries.  The val
17ae0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ue.        ** of
17af0 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f   X is smaller fo
17b00 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
17b10 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74  ueries so that t
17b20 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
17b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
17b40 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73   be more aggress
17b50 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61  ive about genera
17b60 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69  ting automatic i
17b70 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20  ndexes for.     
17b80 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65     ** those obje
17b90 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65  cts, since there
17ba0 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69   is no opportuni
17bb0 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61  ty to add schema
17bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
17bd0 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65  xes on subquerie
17be0 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a  s and views. */.
17bf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
17c00 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
17c10 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20  + rSize + 4;.   
17c20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
17c30 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
17c40 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
17c50 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
17c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
17c70 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b  w->rSetup += 24;
17c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17c90 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
17ca0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65  iplier(pNew->rSe
17cb0 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  tup, pTab->costM
17cc0 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ult);.        /*
17cd0 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e   TUNING: Each in
17ce0 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64  dex lookup yield
17cf0 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65  s 20 rows in the
17d00 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20   table.  This.  
17d10 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65        ** is more
17d20 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20   than the usual 
17d30 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73  guess of 10 rows
17d40 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  , since we have 
17d50 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a  no way.        *
17d60 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77  * of knowing how
17d70 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69   selective the i
17d80 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61  ndex will ultima
17d90 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75  tely be.  It wou
17da0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ld.        ** no
17db0 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c  t be unreasonabl
17dc0 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76  e to make this v
17dd0 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72  alue much larger
17de0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
17df0 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61  w->nOut = 43;  a
17e00 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74  ssert( 43==sqlit
17e10 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a  e3LogEst(20) );.
17e20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
17e30 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
17e40 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70  stAdd(rLogSize,p
17e50 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
17e60 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17e70 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s = WHERE_AUTO_I
17e80 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
17e90 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
17ea0 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
17eb0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
17ec0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
17ed0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
17ee0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
17ef0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
17f00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
17f10 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
17f20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
17f30 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20  er all indices. 
17f40 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
17f50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
17f60 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
17f70 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74  be->pNext, iSort
17f80 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
17f90 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
17fa0 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
17fb0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
17fc0 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e  tialIndex(pSrc->
17fd0 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50  iCursor, pWC, pP
17fe0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
17ff0 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65  ere) ){.      te
18000 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54  stcase( pNew->iT
18010 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  ab!=pSrc->iCurso
18020 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63  r );  /* See tic
18030 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d  ket [98d973b8f5]
18040 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
18050 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
18060 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
18070 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
18080 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
18090 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
180a0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
180b0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
180c0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
180d0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
180e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
180f0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18100 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
18110 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
18120 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72   0;.    pNew->pr
18130 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
18140 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
18150 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d  rSize;.    pNew-
18160 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
18170 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20  = pProbe;.    b 
18180 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  = indexMightHelp
18190 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69  WithOrderBy(pBui
181a0 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53  lder, pProbe, pS
181b0 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
181c0 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53    /* The ONEPASS
181d0 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e  _DESIRED flags n
181e0 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65  ever occurs toge
181f0 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20  ther with ORDER 
18200 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  BY */.    assert
18210 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
18220 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
18230 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
18240 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20  0 || b==0 );.   
18250 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75   if( pProbe->tnu
18260 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  m<=0 ){.      /*
18270 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   Integer primary
18280 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20   key index */.  
18290 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
182a0 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a  s = WHERE_IPK;..
182b0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61        /* Full ta
182c0 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ble scan */.    
182d0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
182e0 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
182f0 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  : 0;.      /* TU
18300 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75  NING: Cost of fu
18310 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73  ll table scan is
18320 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20   (N*3.0). */.   
18330 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
18340 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20  rSize + 16;.    
18350 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
18360 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
18370 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
18380 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
18390 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
183a0 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
183b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
183c0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
183d0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
183e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
183f0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   rSize;.      if
18400 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
18410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
18420 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20  itmask m;.      
18430 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f  if( pProbe->isCo
18440 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  vering ){.      
18450 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18460 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
18470 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
18480 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b  ;.        m = 0;
18490 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
184a0 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e        m = pSrc->
184b0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
184c0 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
184d0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
184e0 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
184f0 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
18500 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
18510 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
18520 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
18530 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
18540 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
18550 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
18560 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  || !HasRowid(pTa
18570 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d  b).       || ( m
18580 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
18590 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
185a0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
185b0 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  & (pProbe->szIdx
185c0 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
185d0 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ow).         && 
185e0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
185f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
18600 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a  ASS_DESIRED)==0.
18610 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
18620 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18630 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20  bUseCis.        
18640 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
18650 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e  Enabled(pWInfo->
18660 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
18670 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29  TE_CoverIdxScan)
18680 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20  .          ).   
18690 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e     ){.        pN
186a0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
186b0 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
186c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
186d0 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
186e0 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73  g the index rows
186f0 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b   is N*K, where K
18700 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62   is.        ** b
18710 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
18720 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .0, depending on
18730 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
18740 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20  zes of the.     
18750 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20     ** index and 
18760 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74  table rows. If t
18770 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
18780 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
18790 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73  ,.        ** als
187a0 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f  o add the cost o
187b0 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65  f visiting table
187c0 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20   rows (N*3.0).  
187d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
187e0 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
187f0 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
18800 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e  szIdxRow)/pTab->
18810 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20  szTabRow;.      
18820 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20    if( m!=0 ){.  
18830 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
18840 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
18850 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
18860 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20  , rSize+16);.   
18870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
18880 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
18890 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
188a0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
188b0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
188c0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
188d0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
188e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
188f0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
18900 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
18910 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
18920 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
18930 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
18940 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18950 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
18960 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
18970 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
18980 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69  , pProbe, 0);.#i
18990 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
189a0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
189b0 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
189c0 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
189d0 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
189e0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
189f0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
18a00 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
18a10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
18a20 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
18a30 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18a40 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
18a50 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
18a60 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
18a70 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
18a80 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20 62  rc->pIBIndex ) b
18a90 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
18aa0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
18ab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18ac0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
18ad0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
18ae0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
18af0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
18b00 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
18b10 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
18b20 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
18b30 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
18b40 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
18b50 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
18b60 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
18b70 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
18b80 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65  OIN joins in the
18b90 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 45 78   query, both mEx
18ba0 74 72 61 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  tra and.** mUnus
18bb0 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
18bc0 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 45  0. Otherwise, mE
18bd0 78 74 72 61 20 69 73 20 61 20 6d 61 73 6b 20 6f  xtra is a mask o
18be0 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  f all FROM claus
18bf0 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  e.** entries tha
18c00 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
18c10 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
18c20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
18c30 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73  use and are.** s
18c40 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
18c50 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
18c60 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
18c70 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  OIN. Similarly, 
18c80 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  the.** mUnusable
18c90 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61   mask contains a
18ca0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ll FROM clause e
18cb0 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
18cc0 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76  r after the.** v
18cd0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64  irtual table and
18ce0 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66   are separated f
18cf0 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61  rom it by at lea
18d00 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a  st one LEFT or .
18d10 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a  ** CROSS JOIN. .
18d20 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
18d30 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  e, if the query 
18d40 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  were:.**.**   ..
18d50 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45  . FROM t1, t2 LE
18d60 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20  FT JOIN t3, t4, 
18d70 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35  vt CROSS JOIN t5
18d80 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , t6;.**.** then
18d90 20 6d 45 78 74 72 61 20 63 6f 72 72 65 73 70 6f   mExtra correspo
18da0 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20  nds to (t1, t2) 
18db0 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f  and mUnusable to
18dc0 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a   (t5, t6)..**.**
18dd0 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20   All the tables 
18de0 69 6e 20 6d 45 78 74 72 61 20 6d 75 73 74 20 62  in mExtra must b
18df0 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
18e00 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
18e10 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20  tual .** table. 
18e20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  So any terms for
18e30 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65   which all prere
18e40 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74  quisites are sat
18e50 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 45  isfied by .** mE
18e60 78 74 72 61 20 6d 61 79 20 62 65 20 73 70 65 63  xtra may be spec
18e70 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c 65  ified as "usable
18e80 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74  " in all calls t
18e90 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a  o xBestIndex. .*
18ea0 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c  * Conversely, al
18eb0 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75  l tables in mUnu
18ec0 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73 63  sable must be sc
18ed0 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  anned after the 
18ee0 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75  current.** virtu
18ef0 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79  al table, so any
18f00 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
18f10 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69 74   the prerequisit
18f20 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68 0a  es overlap with.
18f30 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f  ** mUnusable sho
18f40 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6f  uld always be co
18f50 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f 74  nfigured as "not
18f60 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42 65  -usable" for xBe
18f70 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  stIndex..*/.stat
18f80 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
18f90 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68  AddVirtual(.  Wh
18fa0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
18fb0 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48  pBuilder,  /* WH
18fc0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
18fd0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
18fe0 61 73 6b 20 6d 45 78 74 72 61 2c 20 20 20 20 20  ask mExtra,     
18ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
19000 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
19010 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
19020 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74  his one */.  Bit
19030 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20  mask mUnusable  
19040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19050 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
19060 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
19070 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20  his one */.){.  
19080 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
19090 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
190a0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
190b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
190c0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
190d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
190e0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
190f0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
19100 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
19110 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
19120 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
19130 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19140 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
19150 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
19160 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
19170 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
19180 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
19190 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
191a0 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
191b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
191c0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
191d0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
191e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
191f0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
19200 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
19210 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
19220 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
19230 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
19240 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
19250 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
19260 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19270 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
19280 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
19290 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
192a0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
192b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
192c0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
192d0 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
192e0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
192f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19300 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
19310 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
19320 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
19330 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
19340 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
19350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
19360 20 61 73 73 65 72 74 28 20 28 6d 45 78 74 72 61   assert( (mExtra
19370 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30   & mUnusable)==0
19380 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70   );.  pWInfo = p
19390 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
193a0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
193b0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
193c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
193d0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
193e0 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
193f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
19400 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
19410 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
19420 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62  w->iTab];.  pTab
19430 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
19440 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
19450 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49  al(pTab) );.  pI
19460 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74  dxInfo = allocat
19470 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
19480 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c  e, pWC, mUnusabl
19490 65 2c 20 70 53 72 63 2c 70 42 75 69 6c 64 65 72  e, pSrc,pBuilder
194a0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  ->pOrderBy);.  i
194b0 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
194c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
194d0 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72  OMEM;.  pNew->pr
194e0 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ereq = 0;.  pNew
194f0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
19500 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
19510 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
19520 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  LE;.  pNew->nLTe
19530 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  rm = 0;.  pNew->
19540 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
19550 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  = 0;.  pUsage = 
19560 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
19570 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43  raintUsage;.  nC
19580 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
19590 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
195a0 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f  t;.  if( whereLo
195b0 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
195c0 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
195d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
195e0 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
195f0 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
19600 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
19610 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30  ..  for(iPhase=0
19620 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68  ; iPhase<=3; iPh
19630 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ase++){.    if( 
19640 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61  !seenIn && (iPha
19650 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  se&1)!=0 ){.    
19660 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20    iPhase++;.    
19670 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29    if( iPhase>3 )
19680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19690 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26    if( !seenVar &
196a0 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65  & iPhase>1 ) bre
196b0 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ak;.    pIdxCons
196c0 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
196d0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
196e0 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
196f0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
19700 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
19710 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
19720 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
19730 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d  ns++){.      j =
19740 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19750 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54  Offset;.      pT
19760 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
19770 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
19780 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20  iPhase ){.      
19790 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20    case 0:    /* 
197a0 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75  Constants withou
197b0 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  t IN operator */
197c0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
197d0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b  ons->usable = 0;
197e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
197f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19800 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
19810 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
19820 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  In = 1;.        
19830 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
19840 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
19850 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61 29  Right & ~mExtra)
19860 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
19870 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
19880 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
19890 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
198a0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
198b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
198c0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
198d0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
198e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
198f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
19900 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
19910 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
19920 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
19930 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
19940 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
19950 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
19960 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
19970 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61 29  Right & ~mExtra)
19980 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
19990 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
199a0 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69  se 2:    /* Vari
199b0 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
199c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
199d0 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b  sert( seenVar );
199e0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
199f0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
19a00 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
19a10 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20  & WO_IN)==0;.   
19a20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19a30 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
19a40 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
19a50 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  th IN */.       
19a60 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
19a70 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a  ar && seenIn );.
19a80 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
19a90 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
19aa0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19ac0 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65     memset(pUsage
19ad0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
19ae0 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
19af0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
19b00 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
19b10 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
19b20 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
19b30 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
19b40 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  r);.    pIdxInfo
19b50 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
19b60 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
19b70 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
19b80 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
19b90 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
19ba0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
19bb0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
19bc0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
19bd0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
19be0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
19bf0 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49 64  ouble)2;.    pId
19c00 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
19c10 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20 70  Rows = 25;.    p
19c20 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
19c30 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
19c40 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
19c50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
19c60 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
19c70 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
19c80 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
19c90 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
19ca0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19cb0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19cc0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19cd0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
19ce0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
19cf0 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
19d00 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
19d10 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
19d20 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
19d30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19d40 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
19d50 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
19d60 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19d70 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19d80 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19d90 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19da0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19db0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
19dc0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
19dd0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
19de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19df0 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19e00 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
19e10 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
19e20 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
19e30 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
19e40 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
19e50 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
19e60 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
19e70 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
19e80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19e90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19eb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
19ec0 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
19ed0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
19ee0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
19ef0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
19f00 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
19f10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19f20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
19f30 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
19f40 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
19f50 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
19f60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19f70 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
19f80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
19f90 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
19fa0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
19fb0 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
19fc0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
19fd0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
19fe0 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
19ff0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a000 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1a010 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
1a020 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
1a030 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
1a040 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a050 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1a060 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a070 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
1a080 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
1a090 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1a0a0 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1a0b0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1a0c0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1a0d0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1a0e0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1a0f0 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
1a100 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
1a110 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
1a120 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a130 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
1a140 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
1a150 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
1a160 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1a170 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
1a180 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
1a190 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
1a1a0 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
1a1b0 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
1a1c0 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
1a1d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
1a1e0 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
1a1f0 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
1a200 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
1a210 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
1a220 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
1a230 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a240 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a250 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1a260 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1a270 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1a280 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1a290 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
1a2a0 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
1a2b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1a2c0 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
1a2d0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
1a2e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
1a2f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1a300 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1a310 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1a320 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1a330 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
1a340 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
1a350 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
1a360 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
1a370 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1a380 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1a390 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a3a0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1a3b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a3c0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1a3d0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1a3e0 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1a3f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a400 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a410 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
1a420 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
1a430 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
1a440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a450 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
1a460 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1a470 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1a480 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
1a490 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
1a4a0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a4b0 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1a4c0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1a4d0 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
1a4e0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1a4f0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
1a500 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1a510 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
1a520 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
1a530 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
1a540 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49  rdered = (i8)(pI
1a550 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1a560 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20  onsumed ?.      
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
1a5a0 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  By : 0);.      p
1a5b0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1a5c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1a5d0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1a5e0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
1a5f0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1a600 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
1a610 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
1a620 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
1a630 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
1a640 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
1a650 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1a660 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65 73  flag if the xBes
1a670 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1a680 69 6e 64 69 63 61 74 65 64 0a 20 20 20 20 20 20  indicated.      
1a690 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1a6a0 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1a6b0 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1a6c0 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1a6d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
1a6e0 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1a6f0 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   & SQLITE_INDEX_
1a700 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20  SCAN_UNIQUE ){. 
1a710 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1a720 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
1a730 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EROW;.      }els
1a740 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
1a750 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1a760 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
1a770 20 7d 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f   }.      whereLo
1a780 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a790 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a7a0 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
1a7b0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
1a7c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a7d0 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
1a7e0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
1a7f0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1a800 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
1a810 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
1a820 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
1a830 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
1a840 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a850 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
1a860 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
1a870 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
1a880 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1a890 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
1a8a0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1a8b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1a8c0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
1a8d0 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
1a8e0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
1a8f0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
1a900 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
1a910 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
1a920 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1a930 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1a940 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1a950 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1a960 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a  der *pBuilder, .
1a970 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
1a980 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  , .  Bitmask mUn
1a990 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72  usable.){.  Wher
1a9a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1a9b0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1a9c0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1a9d0 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
1a9e0 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
1a9f0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
1aa00 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
1aa10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1aa20 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
1aa30 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
1aa40 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1aa50 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
1aa60 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
1aa70 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
1aa80 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1aa90 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
1aaa0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1aab0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1aac0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
1aad0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1aae0 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
1aaf0 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
1ab00 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
1ab10 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1ab20 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
1ab30 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
1ab40 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
1ab50 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1ab60 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
1ab70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1ab80 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
1ab90 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1aba0 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
1abb0 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1abc0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
1abd0 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
1abe0 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
1abf0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
1ac00 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
1ac10 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
1ac20 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1ac30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
1ac40 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
1ac50 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
1ac60 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
1ac70 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1ac80 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
1ac90 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
1aca0 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
1acb0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
1acc0 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
1acd0 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
1ace0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
1acf0 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
1ad00 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
1ad10 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1ad20 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
1ad30 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1ad40 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1ad50 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
1ad60 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
1ad70 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
1ad80 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1ad90 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
1ada0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
1adb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1adc0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1add0 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
1ade0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1adf0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
1ae00 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1ae10 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
1ae20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
1ae30 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
1ae40 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1ae50 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
1ae60 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1ae70 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
1ae80 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
1ae90 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1aea0 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
1aeb0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
1aec0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1aed0 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
1aee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1aef0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1af00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1af10 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
1af20 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1af30 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
1af40 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1af50 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
1af60 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
1af70 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
1af80 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1af90 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
1afa0 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
1afb0 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
1afc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1afd0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1afe0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
1aff0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b000 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  <sSubBuild.pWC->
1b010 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
1b020 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65           whereTe
1b030 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69  rmPrint(&sSubBui
1b040 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29  ld.pWC->a[i], i)
1b050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b060 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
1b070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b080 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1b090 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
1b0a0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1b0b0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
1b0c0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b0d0 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
1b0e0 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e  ild, mExtra, mUn
1b0f0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1b100 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1b110 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b120 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b130 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1b140 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
1b150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1b180 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1b190 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1b1a0 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65  Extra, mUnusable
1b1b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1b1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
1b1e0 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
1b1f0 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
1b200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1b210 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1b220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b230 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
1b240 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
1b250 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
1b260 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
1b270 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1b280 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b290 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
1b2a0 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
1b2b0 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1b2c0 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
1b2d0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1b2e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
1b2f0 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
1b300 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1b310 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b320 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1b340 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
1b350 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
1b360 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
1b370 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b390 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1b3a0 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
1b3b0 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
1b3c0 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1b3f0 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
1b400 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
1b410 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
1b420 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1b430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b440 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
1b450 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1b460 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
1b470 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
1b480 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1b490 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
1b4a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
1b4b0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
1b4c0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
1b4d0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1b4e0 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
1b4f0 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
1b500 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1b510 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
1b520 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
1b530 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1b540 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
1b550 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
1b560 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
1b570 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
1b580 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
1b590 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
1b5a0 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
1b5b0 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
1b5c0 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
1b5d0 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
1b5e0 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
1b5f0 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
1b600 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
1b610 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
1b620 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
1b630 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
1b640 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
1b650 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
1b660 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
1b670 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
1b680 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
1b690 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
1b6a0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
1b6b0 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
1b6c0 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
1b6d0 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
1b6e0 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
1b6f0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
1b700 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
1b710 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
1b720 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1b730 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
1b740 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
1b750 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
1b760 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1b770 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
1b780 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
1b790 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
1b7a0 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
1b7b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1b7c0 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
1b7d0 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
1b7e0 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
1b7f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1b800 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
1b810 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
1b820 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
1b830 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
1b840 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1b850 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
1b860 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
1b870 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1b880 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1b890 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1b8a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1b8b0 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
1b8c0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1b8d0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1b8e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b8f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1b900 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1b910 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
1b920 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
1b930 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1b940 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
1b950 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1b960 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
1b970 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1b980 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
1b990 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
1b9a0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1b9b0 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1b9c0 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1b9d0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1b9e0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1b9f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ba00 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1ba10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ba20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1ba30 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1ba40 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1ba50 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1ba60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1ba70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ba80 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1ba90 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1baa0 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1bab0 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1bac0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1bad0 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1bae0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1baf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1bb00 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1bb10 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1bb20 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1bb30 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1bb40 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1bb50 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1bb60 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1bb70 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1bb80 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1bb90 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1bba0 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1bbb0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1bbc0 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1bbd0 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1bbe0 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1bbf0 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1bc00 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1bc10 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1bc20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1bc30 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1bc40 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1bc50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1bc60 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1bc70 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1bc80 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1bc90 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1bca0 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50       mExtra = mP
1bcb0 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
1bcc0 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1bcd0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
1bce0 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
1bcf0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1bd00 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  b) ){.      stru
1bd10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bd20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
1bd30 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e  &pItem[1]; p<pEn
1bd40 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
1bd50 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c   if( mUnusable |
1bd60 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  | (p->fg.jointyp
1bd70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1bd80 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20  CROSS)) ){.     
1bd90 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c       mUnusable |
1bda0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1bdb0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1bdc0 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72  MaskSet, p->iCur
1bdd0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sor);.        }.
1bde0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1bdf0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1be00 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
1be10 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62   mExtra, mUnusab
1be20 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
1be30 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1be40 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
1be50 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
1be60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1be70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1be80 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1be90 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
1bea0 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73  r, mExtra, mUnus
1beb0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1bec0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1bed0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1bee0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1bef0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1bf00 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1bf10 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1bf20 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1bf30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1bf40 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1bf50 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1bf60 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1bf70 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
1bf80 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1bf90 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1bfa0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1bfb0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1bfc0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1bfd0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1bfe0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1bff0 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1c000 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1c010 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1c020 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1c030 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1c040 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1c050 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1c060 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c070 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1c080 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1c090 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1c0a0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1c0b0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1c0c0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1c0d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1c0e0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1c0f0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1c100 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c110 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1c120 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1c130 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c140 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1c150 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1c160 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1c170 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1c180 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1c190 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1c1a0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1c1b0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1c1c0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1c1d0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1c1e0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1c1f0 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1c200 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1c210 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1c220 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1c230 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c240 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1c250 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1c260 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1c270 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1c280 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1c290 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1c2a0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1c2b0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1c2c0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1c2d0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1c2e0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1c2f0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1c300 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1c310 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c320 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c330 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1c340 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1c350 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1c360 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1c370 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1c380 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1c390 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1c3a0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1c3b0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1c3c0 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
1c3d0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
1c3e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c3f0 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
1c400 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1c410 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1c420 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
1c430 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
1c440 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
1c450 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
1c460 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
1c470 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
1c480 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
1c490 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
1c4a0 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
1c4b0 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
1c4c0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1c4d0 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
1c4e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1c4f0 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
1c500 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
1c510 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1c520 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
1c530 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1c540 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
1c550 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
1c560 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1c570 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
1c580 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
1c590 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
1c5a0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
1c5b0 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
1c5c0 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
1c5d0 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
1c5e0 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
1c5f0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
1c600 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
1c610 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
1c620 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
1c630 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c640 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
1c650 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
1c660 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
1c670 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
1c680 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
1c690 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1c6a0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c6b0 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
1c6c0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1c6d0 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
1c6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c6f0 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
1c700 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c710 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1c720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c730 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
1c740 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
1c750 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
1c760 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1c770 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c780 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1c790 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1c7a0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1c7b0 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
1c7c0 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
1c7d0 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1c7e0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
1c7f0 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
1c800 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
1c810 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1c820 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
1c830 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
1c840 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
1c850 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1c860 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1c870 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1c880 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1c890 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
1c8a0 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
1c8b0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
1c8c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c8d0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1c8e0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
1c8f0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
1c900 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
1c910 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
1c920 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1c930 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1c940 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1c950 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
1c960 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1c970 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
1c980 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1c990 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
1c9a0 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
1c9b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
1c9c0 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1c9d0 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
1c9e0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
1c9f0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
1ca00 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
1ca10 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
1ca20 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
1ca30 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
1ca40 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
1ca50 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
1ca60 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
1ca70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ca80 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
1ca90 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
1caa0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1cab0 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
1cac0 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
1cad0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1cae0 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
1caf0 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
1cb00 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
1cb10 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1cb20 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1cb30 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
1cb40 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
1cb50 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
1cb60 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
1cb70 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
1cb80 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
1cb90 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
1cba0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1cbb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
1cbc0 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
1cbd0 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
1cbe0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1cbf0 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
1cc00 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
1cc10 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
1cc20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
1cc30 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1cc40 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
1cc50 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
1cc60 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
1cc70 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
1cc80 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
1cc90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cca0 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
1ccb0 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
1ccc0 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
1ccd0 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
1cce0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
1ccf0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
1cd00 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
1cd10 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
1cd20 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
1cd30 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
1cd40 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1cd50 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
1cd60 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
1cd70 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
1cd80 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
1cd90 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
1cda0 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
1cdb0 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
1cdc0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
1cdd0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1cde0 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
1cdf0 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
1ce00 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
1ce10 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
1ce20 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
1ce30 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
1ce40 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
1ce50 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
1ce60 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
1ce70 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
1ce80 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
1ce90 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
1cea0 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
1ceb0 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
1cec0 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
1ced0 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
1cee0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1cef0 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
1cf00 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
1cf10 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
1cf20 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
1cf30 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
1cf40 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1cf50 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
1cf60 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
1cf70 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1cf80 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1cf90 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
1cfa0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1cfb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1cfc0 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
1cfd0 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
1cfe0 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
1cff0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
1d000 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
1d010 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
1d020 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
1d030 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1d040 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
1d050 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
1d060 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
1d070 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
1d080 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
1d090 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
1d0a0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
1d0b0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
1d0c0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
1d0d0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
1d0e0 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
1d0f0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1d100 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
1d110 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
1d120 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
1d130 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
1d140 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d150 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d160 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1d170 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
1d180 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
1d190 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
1d1a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d1b0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
1d1c0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
1d1d0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
1d1e0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
1d1f0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
1d200 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
1d210 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1d220 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
1d230 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
1d240 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
1d250 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
1d260 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
1d270 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
1d280 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
1d290 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
1d2a0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
1d2b0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
1d2c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1d2d0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1d2e0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1d2f0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1d300 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
1d310 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d320 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1d330 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1d340 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
1d350 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1d360 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1d370 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1d380 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1d390 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d3a0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
1d3b0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
1d3c0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
1d3d0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
1d3e0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
1d400 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
1d410 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
1d420 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1d430 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d440 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1d450 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
1d460 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
1d470 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1d480 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1d490 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
1d4a0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
1d4b0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d4c0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1d4d0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1d4e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1d4f0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1d500 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1d510 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d520 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
1d530 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
1d540 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1d550 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1d560 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1d570 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1d580 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1d590 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1d5a0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
1d5b0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1d5c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d5d0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1d5e0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1d5f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d600 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
1d610 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1d620 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
1d630 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1d640 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
1d650 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d660 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
1d670 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1d680 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d690 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
1d6a0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1d6b0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1d6c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
1d6d0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
1d6e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
1d6f0 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1d700 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
1d710 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
1d720 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
1d730 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1d740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
1d750 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
1d760 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
1d770 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
1d780 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
1d790 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
1d7a0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
1d7b0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d7c0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
1d7d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d7e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1d7f0 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
1d800 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d830 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
1d840 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1d850 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
1d860 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
1d870 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d880 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
1d890 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
1d8a0 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
1d8b0 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
1d8c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
1d8d0 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
1d8e0 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
1d8f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
1d900 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
1d910 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
1d920 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
1d930 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
1d940 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1d950 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
1d960 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
1d970 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
1d980 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
1d990 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
1d9a0 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
1d9b0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
1d9c0 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
1d9d0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
1d9e0 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70   && pLoop->nSkip
1d9f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1da00 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ((i = pLoop->aLT
1da10 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
1da20 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  r) & (WO_EQ|WO_I
1da30 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30  SNULL|WO_IS))!=0
1da40 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1da50 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
1da60 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1da70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1da80 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1da90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1daa0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1dab0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1dac0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1dad0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
1dae0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
1daf0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1db00 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
1db10 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
1db20 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
1db30 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
1db40 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1db50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
1db60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1db70 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1db80 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
1db90 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1dba0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1dbb0 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
1dbc0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
1dbd0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1dbe0 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
1dbf0 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
1dc00 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
1dc10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dc20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
1dc30 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1dc40 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1dc50 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1dc60 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1dc70 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1dc80 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1dc90 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1dca0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1dcb0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1dcc0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1dcd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dce0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1dcf0 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1dd00 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1dd10 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1dd20 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1dd30 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1dd40 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1dd50 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1dd60 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1dd70 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1dd80 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1dd90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1dda0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1ddb0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1ddc0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1ddd0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1dde0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1ddf0 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1de00 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1de10 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1de20 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1de30 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1de40 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1de50 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1de60 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1de70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1de80 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1de90 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1dea0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1deb0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1dec0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1ded0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1dee0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1def0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1df00 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1df10 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1df20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1df30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1df40 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1df50 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1df60 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1df70 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1df80 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1df90 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1dfa0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
1dfb0 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
1dfc0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1dfd0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1dfe0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1dff0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1e000 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1e010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e020 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1e030 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1e040 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1e050 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
1e060 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e070 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1e080 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
1e090 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
1e0a0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
1e0b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1e0c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1e0d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e0f0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
1e100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e110 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1e120 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1e130 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1e140 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1e150 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e160 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1e170 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1e180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e190 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e1a0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
1e1b0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
1e1c0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1e1d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e1e0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1e1f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1e200 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1e210 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1e220 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
1e230 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1e240 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e250 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1e260 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
1e270 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
1e280 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1e290 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
1e2a0 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
1e2b0 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
1e2c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1e2d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1e2e0 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
1e2f0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
1e300 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
1e310 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1e320 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
1e330 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1e340 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e350 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
1e360 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1e370 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
1e380 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
1e390 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
1e3a0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
1e3b0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
1e3c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1e3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e3e0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
1e3f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e400 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1e410 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e420 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
1e430 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
1e440 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
1e450 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
1e460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
1e470 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1e480 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
1e490 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e4a0 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
1e4b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1e4c0 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
1e4d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1e4e0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1e4f0 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
1e500 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1e510 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1e520 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e530 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e550 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
1e560 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
1e570 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
1e580 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1e590 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e5a0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1e5b0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
1e5c0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1e5d0 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
1e5e0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
1e5f0 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
1e600 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
1e610 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
1e620 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
1e630 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
1e640 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
1e650 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1e660 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
1e670 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
1e680 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
1e690 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1e6a0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1e6b0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
1e6c0 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
1e6d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
1e6e0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1e6f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e700 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
1e710 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
1e720 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
1e730 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
1e740 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
1e750 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
1e760 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
1e770 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
1e780 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
1e790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e7a0 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
1e7b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
1e7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e7d0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1e7e0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1e7f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e800 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
1e810 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
1e820 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
1e830 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
1e840 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
1e850 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
1e860 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
1e870 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
1e880 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1e890 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
1e8a0 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
1e8b0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1e8c0 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
1e8d0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
1e8e0 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
1e8f0 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
1e900 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e910 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
1e920 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
1e930 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
1e940 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
1e950 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
1e960 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1e970 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
1e980 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1e990 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
1e9a0 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
1e9b0 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
1e9c0 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
1e9d0 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
1e9e0 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
1e9f0 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
1ea00 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
1ea10 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
1ea20 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
1ea30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1ea40 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
1ea50 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
1ea60 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
1ea70 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
1ea80 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
1ea90 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
1eaa0 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
1eab0 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
1eac0 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
1ead0 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
1eae0 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
1eaf0 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
1eb00 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
1eb10 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
1eb20 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1eb30 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
1eb40 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1eb50 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
1eb60 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1eb70 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
1eb80 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
1eb90 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
1eba0 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
1ebb0 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
1ebc0 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
1ebd0 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
1ebe0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
1ebf0 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
1ec00 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1ec10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1ec20 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
1ec30 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
1ec40 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
1ec50 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
1ec60 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
1ec70 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
1ec80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1ec90 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
1eca0 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
1ecb0 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
1ecc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
1ecd0 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
1ece0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1ecf0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ed00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ed10 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
1ed20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ed30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ed40 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
1ed50 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
1ed60 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
1ed70 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1ed80 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
1ed90 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
1eda0 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
1edb0 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
1edc0 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
1edd0 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
1ede0 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
1edf0 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
1ee00 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
1ee10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1ee20 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
1ee30 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
1ee40 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
1ee50 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
1ee60 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
1ee70 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
1ee80 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
1ee90 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
1eea0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1eeb0 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
1eec0 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
1eed0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
1eee0 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
1eef0 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
1ef00 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
1ef10 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
1ef20 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
1ef30 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
1ef40 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
1ef50 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
1ef60 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1ef70 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
1ef80 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
1ef90 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
1efa0 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
1efb0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
1efc0 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
1efd0 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
1efe0 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
1eff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1f000 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
1f010 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
1f020 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
1f030 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
1f040 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
1f050 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
1f060 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
1f070 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
1f080 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
1f090 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
1f0a0 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
1f0b0 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
1f0c0 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
1f0d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
1f0e0 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
1f0f0 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
1f100 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
1f110 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
1f120 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
1f130 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
1f140 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
1f150 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
1f160 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
1f170 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1f180 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
1f190 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
1f1a0 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
1f1b0 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
1f1c0 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
1f1d0 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
1f1e0 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
1f1f0 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52  nRow + estLog(nR
1f200 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  ow) + rScale + 1
1f210 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  6;..  /* TUNING:
1f220 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70   The cost of imp
1f230 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e  lementing DISTIN
1f240 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45  CT using a B-TRE
1f250 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61  E is.  ** simila
1f260 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61 72  r but with a lar
1f270 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20  ger constant of 
1f280 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e  proportionality.
1f290 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20   .  ** Multiply 
1f2a0 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
1f2b0 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20   factor of 3.0. 
1f2c0 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
1f2d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1f2e0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
1f2f0 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74 43  CT ){.    rSortC
1f300 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a  ost += 16;.  }..
1f310 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
1f320 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
1f330 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
1f340 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1f350 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
1f360 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
1f370 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
1f380 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
1f390 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
1f3a0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
1f3b0 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
1f3c0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
1f3d0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
1f3e0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
1f3f0 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
1f400 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
1f410 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1f420 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
1f430 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
1f440 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
1f450 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
1f460 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
1f470 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
1f480 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
1f490 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
1f4a0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
1f4b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f4c0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
1f4d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
1f4e0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f4f0 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
1f500 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f510 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
1f520 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
1f530 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
1f540 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
1f550 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
1f560 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
1f570 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
1f580 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
1f590 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
1f5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f5b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1f5c0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
1f5d0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1f5e0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
1f5f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1f600 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
1f610 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1f620 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f630 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f640 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
1f650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f660 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
1f670 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1f680 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
1f690 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
1f6a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f6b0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
1f6c0 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
1f6d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f6e0 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
1f6f0 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
1f700 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1f710 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f720 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
1f730 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
1f740 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
1f750 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1f760 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
1f770 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
1f780 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
1f790 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
1f7a0 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
1f7b0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
1f7c0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
1f7d0 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
1f7e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1f7f0 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
1f800 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
1f810 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
1f820 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
1f830 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
1f840 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
1f850 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
1f860 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
1f870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f880 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
1f890 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
1f8a0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
1f8b0 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
1f8c0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
1f8d0 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
1f8e0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1f8f0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
1f900 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
1f910 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
1f920 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
1f930 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1f940 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f950 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
1f960 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
1f970 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
1f980 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
1f990 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
1f9a0 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
1f9b0 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
1f9c0 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
1f9d0 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
1f9e0 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
1f9f0 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
1fa00 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
1fa10 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
1fa20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1fa30 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
1fa40 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
1fa50 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa70 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
1fa80 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
1fa90 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
1faa0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1fab0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
1fac0 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
1fad0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
1fae0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
1faf0 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
1fb00 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
1fb10 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
1fb20 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
1fb30 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
1fb40 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
1fb50 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
1fb60 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
1fb70 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
1fb80 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
1fb90 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
1fba0 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
1fbb0 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
1fbc0 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
1fbd0 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
1fbe0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
1fbf0 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
1fc00 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
1fc10 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
1fc20 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
1fc30 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
1fc40 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
1fc50 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1fc60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fc70 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
1fc80 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
1fc90 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
1fca0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
1fcb0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
1fcc0 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1fcd0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
1fce0 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
1fcf0 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
1fd00 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1fd10 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
1fd20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
1fd30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
1fd40 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
1fd50 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
1fd60 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
1fd70 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
1fd80 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
1fd90 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
1fda0 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
1fdb0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
1fdc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fdd0 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
1fde0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1fdf0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
1fe00 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1fe10 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
1fe20 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
1fe30 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
1fe40 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
1fe50 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
1fe60 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
1fe70 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
1fe80 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
1fe90 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
1fea0 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
1feb0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1fec0 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63 65  ocRaw(db, nSpace
1fed0 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
1fee0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1fef0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
1ff00 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
1ff10 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
1ff20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
1ff30 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
1ff40 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
1ff50 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
1ff60 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
1ff70 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
1ff80 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
1ff90 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
1ffa0 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
1ffb0 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
1ffc0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
1ffd0 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  pX;.  }.  if( nO
1ffe0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
1fff0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
20000 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20010 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65  and it is not be
20020 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74  ing ignored, set
20030 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65   up.    ** space
20040 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f   for the aSortCo
20050 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68  st[] array. Each
20060 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
20070 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a  aSortCost array.
20080 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
20090 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20   zero - meaning 
200a0 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
200b0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
200c0 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  - or the.    ** 
200d0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
200e0 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20  nRowEst rows of 
200f0 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66  data where the f
20100 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a  irst X terms of.
20110 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
20120 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61   BY clause are a
20130 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c  lready in order,
20140 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20   where X is the 
20150 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e  array .    ** in
20160 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f  dex.  */.    aSo
20170 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74  rtCost = (LogEst
20180 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74  *)pX;.    memset
20190 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73  (aSortCost, 0, s
201a0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
201b0 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  nOrderBy);.  }. 
201c0 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
201d0 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st==0 || &pSpace
201e0 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
201f0 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64  )&aSortCost[nOrd
20200 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72  erBy] );.  asser
20210 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20  t( aSortCost!=0 
20220 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
20230 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b  e]==(char*)pX );
20240 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
20250 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
20260 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
20270 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
20280 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
20290 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
202a0 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
202b0 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
202c0 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49   go above 28.  I
202d0 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
202e0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
202f0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
20300 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
20310 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
20320 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 28.  ** rows, 
20330 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
20340 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
20350 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
20360 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
20370 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
20380 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20  , 48);  assert( 
20390 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  48==sqlite3LogEs
203a0 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(28) );.  nFrom
203b0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
203c0 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
203d0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ed==0 );.  if( n
203e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
203f0 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65  * If nLoop is ze
20400 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ro, then there a
20410 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73  re no FROM terms
20420 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53   in the query. S
20430 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ince.    ** in t
20440 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65  his case the que
20450 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20  ry may return a 
20460 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72  maximum of one r
20470 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ow, the results.
20480 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
20490 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  dy in the reques
204a0 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69  ted order. Set i
204b0 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64  sOrdered to nOrd
204c0 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69  erBy to.    ** i
204d0 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72  ndicate this. Or
204e0 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72  , if nLoop is gr
204f0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
20500 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   set isOrdered t
20510 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64  o.    ** -1, ind
20520 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
20530 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20   result set may 
20540 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72  or may not be or
20550 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64  dered, .    ** d
20560 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
20570 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74  loops added to t
20580 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e  he current plan.
20590 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30    */.    aFrom[0
205a0 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
205b0 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72  oop>0 ? -1 : nOr
205c0 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
205d0 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
205e0 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
205f0 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
20600 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
20610 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
20620 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
20630 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
20640 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
20650 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
20660 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
20670 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
20680 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
20690 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
206a0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
206b0 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
206c0 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
206d0 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
206e0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
206f0 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
20700 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
20710 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
20720 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
20730 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
20740 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20   nOut;          
20750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20760 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28  ows visited by (
20770 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
20780 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
20790 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  rCost;          
207a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
207b0 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f  st of path (pFro
207c0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
207d0 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73       LogEst rUns
207e0 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  orted;          
207f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
20800 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f  ed cost of (pFro
20810 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
20820 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65       i8 isOrdere
20830 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
20840 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65  ered;  /* isOrde
20850 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70  red for (pFrom+p
20860 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
20870 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
20880 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
20890 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
208a0 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e  rc visited by (.
208b0 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  .) */.        Bi
208c0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
208d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
208e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f  /* Mask of rev-o
208f0 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28  rder loops for (
20900 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ..) */..        
20910 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
20920 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
20930 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
20940 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
20950 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
20960 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
20970 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
20980 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
20990 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
209a0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
209b0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
209c0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
209d0 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
209e0 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
209f0 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
20a00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
20a10 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
20a20 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
20a30 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
20a40 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
20a50 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
20a60 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
20a70 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
20a80 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
20a90 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
20aa0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
20ab0 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
20ac0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
20ad0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
20ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
20af0 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
20b00 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
20b10 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
20b20 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
20b30 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
20b40 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20b50 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
20b60 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
20b70 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20b90 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
20ba0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
20bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20bc0 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
20bd0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
20be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20bf0 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
20c00 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
20c10 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
20c20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
20c30 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
20c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
20c50 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20c60 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
20c70 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
20c80 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
20c90 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
20ca0 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
20cb0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20cd0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
20ce0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
20cf0 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
20d00 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
20d10 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
20d20 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
20d30 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
20d40 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
20d50 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
20d60 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
20d70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20d80 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
20d90 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
20da0 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
20db0 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
20dc0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
20dd0 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
20de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20df0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
20e00 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
20e10 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
20e20 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
20e30 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
20e40 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
20e50 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
20e60 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
20e70 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
20e80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20e90 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
20ea0 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
20eb0 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
20ec0 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
20ed0 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
20ee0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
20ef0 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
20f00 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
20f10 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
20f20 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
20f30 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
20f40 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
20f50 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
20f60 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
20f70 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
20f80 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
20f90 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
20fa0 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
20fb0 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
20fc0 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
20fd0 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
20fe0 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
20ff0 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
21000 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
21010 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21020 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
21030 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
21040 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
21050 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
21060 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
21070 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
21080 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
21090 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
210a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
210b0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
210c0 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
210d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
210e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
210f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21100 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
21110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21120 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
21130 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
21140 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
21150 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
21160 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
21170 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
21180 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
21190 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
211a0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
211b0 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
211c0 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
211d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
211e0 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
211f0 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
21200 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
21210 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
21220 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
21230 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
21240 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
21250 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
21260 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
21270 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
21280 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
21290 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
212a0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
212b0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
212c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
212d0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
212f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21300 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
21310 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21320 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21330 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
21340 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
21350 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
21360 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
21370 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
21380 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
21390 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
213a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
213b0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
213c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
213d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
213e0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
213f0 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
21400 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
21410 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
21420 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
21430 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
21440 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
21450 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
21460 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
21470 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
21480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
21490 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
214a0 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
214b0 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
214c0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
214d0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
214e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
214f0 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
21500 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
21510 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
21520 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
21530 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
21540 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
21550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21560 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
21570 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
21580 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
21590 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
215a0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
215b0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
215c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
215d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
215e0 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
215f0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
21600 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21610 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
21620 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
21630 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
21640 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
21650 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
21660 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
21670 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
21680 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
216a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
216b0 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
216c0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
216d0 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f  h pTo=aTo[jj] co
216e0 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20  vers the.       
216f0 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f     ** same set o
21700 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
21710 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65  the sam isOrdere
21720 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
21730 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
21740 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
21750 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
21760 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
21770 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
21780 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
21790 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
217a0 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
217b0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
217c0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
217d0 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
217e0 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54  ost==rCost && pT
217f0 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29  o->nRow<=nOut) )
21800 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
21810 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
21820 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
21830 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
21840 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21860 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21880 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
21890 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
218a0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
218b0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
218c0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
218d0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
218e0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21900 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21910 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21930 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21940 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
21950 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
21960 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
21970 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
21980 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
21990 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
219a0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
219d0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
219e0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
219f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
21a00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
21a10 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
21a20 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
21a30 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
21a40 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
21a50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21a60 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
21a70 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
21a80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21a90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21aa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21ab0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
21ac0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
21ad0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
21ae0 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
21af0 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
21b00 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
21b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
21b20 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
21b30 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
21b40 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
21b50 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
21b60 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
21b70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21b80 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
21b90 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
21ba0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21bb0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
21bc0 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
21bd0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21be0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21bf0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
21c00 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
21c10 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
21c20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21c40 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21c50 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21c70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21c80 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
21c90 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21ca0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21cb0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21cc0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21cd0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21ce0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
21d00 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
21d10 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
21d20 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
21d30 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21d50 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
21d60 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
21d70 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
21d80 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
21d90 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
21da0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
21db0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
21dc0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
21dd0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
21de0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
21df0 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
21e00 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
21e10 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
21e20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
21e30 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
21e40 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
21e50 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
21e60 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
21e70 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
21e80 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
21e90 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
21ea0 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
21eb0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
21ec0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
21ed0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
21ee0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
21ef0 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
21f00 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
21f10 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
21f20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
21f30 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
21f40 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
21f50 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
21f60 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
21f70 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
21f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21f90 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
21fa0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
21fb0 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
21fc0 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
21fd0 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
21fe0 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
21ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22000 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
22010 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
22020 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
22030 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
22040 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
22050 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
22060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
22090 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
220a0 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
220b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
220c0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
220d0 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
220e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
220f0 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
22100 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
22110 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
22120 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
22130 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
22140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
22150 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22160 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
22170 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
22180 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
22190 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
221a0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
221b0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
221c0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
221d0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
221e0 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
221f0 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
22200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
22210 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
22220 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22230 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22240 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
22250 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
22260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
22280 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
22290 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
222a0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
222b0 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
222c0 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
222d0 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
222e0 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
222f0 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
22300 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
22310 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
22320 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
22330 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
22340 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
22350 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
22360 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
22370 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
22380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
22390 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
223a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
223b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
223c0 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
223d0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
223e0 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
223f0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
22400 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
22410 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
22420 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
22430 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
22440 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
22450 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
22460 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
22470 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
22480 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
22490 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
224a0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
224b0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
224c0 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
224d0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
224e0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
224f0 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
22500 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
22510 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
22520 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
22530 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
22540 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
22550 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
22560 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
22570 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
22580 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
22590 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
225a0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
225b0 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
225c0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
225d0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
225e0 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
225f0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
22600 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22610 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
22620 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
22630 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
22640 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
22650 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
22660 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
22670 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
22680 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
22690 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
226a0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
226b0 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
226d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
226e0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
226f0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
22700 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
22710 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
22720 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
22730 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
22740 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22750 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
22760 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
22770 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
22780 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
22790 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
227a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
227b0 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
227c0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
227d0 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
227e0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
227f0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
22800 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22810 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
22820 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
22830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22840 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
22850 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
22860 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
22870 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20  nfo->nOBSat<0 ) 
22880 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
22890 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   0;.      pWInfo
228a0 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
228b0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
228c0 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
228d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
228e0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
228f0 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
22900 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
22910 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
22920 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
22930 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
22940 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
22950 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
22960 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
22970 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
22980 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
22990 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
229a0 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
229b0 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
229c0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
229d0 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
229e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
229f0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
22a00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
22a10 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
22a20 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
22a30 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
22a40 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
22a50 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
22a60 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
22a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22a80 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
22a90 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
22aa0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
22ab0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
22ac0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
22ad0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
22ae0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
22af0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
22b00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22b10 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
22b20 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
22b30 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
22b40 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
22b50 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
22b60 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
22b70 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
22b80 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
22b90 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
22ba0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
22bb0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
22bc0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
22bd0 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
22be0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
22bf0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
22c00 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
22c10 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
22c20 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
22c30 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
22c40 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
22c50 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
22c60 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
22c70 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
22c80 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
22c90 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
22ca0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
22cb0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
22cc0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
22cd0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
22ce0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
22cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22d00 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
22d10 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
22d20 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
22d30 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
22d40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22d50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22d60 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
22d70 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
22d80 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
22d90 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
22da0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
22db0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22dc0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
22dd0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
22de0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
22df0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
22e00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
22e10 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
22e20 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
22e30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22e40 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
22e50 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
22e60 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
22e70 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
22e80 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
22e90 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
22ea0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
22eb0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
22ec0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
22ed0 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
22ee0 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
22ef0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
22f00 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
22f10 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
22f20 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
22f30 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
22f40 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
22f50 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
22f60 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
22f70 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
22f80 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
22f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
22fa0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
22fb0 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
22fc0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
22fd0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
22fe0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
22ff0 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
23000 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
23010 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
23020 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
23030 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
23040 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
23050 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
23060 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
23070 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
23080 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
23090 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
230a0 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
230b0 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
230c0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
230d0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
230e0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
230f0 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
23100 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
23110 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
23120 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
23130 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
23140 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
23150 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
23160 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
23170 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
23180 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
23190 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
231a0 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
231b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
231c0 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
231d0 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
231e0 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
231f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
23200 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
23210 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
23220 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
23230 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
23240 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
23250 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
23260 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
23270 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
23280 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
23290 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
232a0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
232b0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
232c0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
232d0 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
232e0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
232f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
23300 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
23310 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
23320 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
23330 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
23340 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
23350 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
23360 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
23370 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
23380 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23390 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
233a0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
233b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
233c0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
233d0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
233e0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
233f0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
23400 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
23410 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
23420 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
23430 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
23440 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
23450 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
23460 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
23470 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
23480 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
23490 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
234a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
234b0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
234c0 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
234d0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
234e0 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
234f0 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
23500 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lf = sqlite3Wher
23510 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
23520 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
23530 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
23540 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
23550 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
23560 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
23570 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
23580 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
23590 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
235a0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
235b0 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
235c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
235d0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
235e0 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
235f0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
23600 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
23610 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
23620 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
23630 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
23640 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
23650 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
23660 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23670 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
23680 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
23690 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
236a0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
236b0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
236c0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
236d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
236e0 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
236f0 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
23700 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
23710 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
23720 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
23730 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
23740 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
23750 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
23760 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
23770 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
23780 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
23790 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
237a0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
237b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
237c0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
237d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
237e0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
237f0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
23800 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
23810 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
23820 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
23830 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
23840 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
23850 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
23860 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
23870 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
23880 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
23890 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
238a0 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
238b0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
238c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
238d0 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
238e0 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
238f0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
23900 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
23910 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
23920 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
23930 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
23940 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
23950 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
23960 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
23970 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
23980 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
23990 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
239a0 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
239b0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
239c0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
239d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
239e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
239f0 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
23a00 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
23a10 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
23a20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
23a40 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23a50 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23a80 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
23a90 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
23ac0 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
23ad0 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
23ae0 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
23af0 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
23b00 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
23b10 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
23b20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
23b30 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
23b40 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
23b50 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
23b60 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
23b70 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
23b80 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
23b90 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
23ba0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
23bb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
23bc0 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
23bd0 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
23be0 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
23bf0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
23c00 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
23c10 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
23c20 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
23c30 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
23c40 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
23c50 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
23c60 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
23c70 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
23c80 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
23c90 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
23ca0 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
23cb0 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
23cc0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
23cd0 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
23ce0 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
23cf0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
23d00 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
23d10 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
23d20 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
23d30 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
23d40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23d50 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
23d60 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
23d70 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
23d80 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
23d90 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
23da0 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
23db0 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
23dc0 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
23dd0 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
23de0 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
23df0 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
23e00 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
23e10 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
23e20 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
23e30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
23e40 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
23e50 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
23e60 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
23e70 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
23e80 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
23e90 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
23ea0 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
23eb0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
23ec0 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
23ed0 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
23ee0 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
23ef0 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
23f00 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
23f10 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
23f20 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
23f30 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
23f40 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
23f50 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
23f60 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
23f70 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
23f80 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
23f90 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
23fa0 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
23fb0 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
23fc0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
23fd0 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
23fe0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
23ff0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
24000 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
24010 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
24020 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
24030 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
24040 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
24050 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
24060 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
24070 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
24080 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
24090 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
240a0 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
240b0 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
240c0 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
240d0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
240e0 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
240f0 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
24100 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
24110 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
24120 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
24130 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
24140 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
24150 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
24160 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
24170 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
24180 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
24190 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
241a0 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
241b0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
241c0 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
241d0 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
241e0 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
241f0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
24200 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
24210 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
24220 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
24230 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
24240 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
24250 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
24260 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
24270 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
24280 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
24290 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
242a0 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
242b0 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
242c0 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
242d0 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
242e0 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
242f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24300 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
24310 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
24320 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
24330 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
24340 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
24350 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
24360 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24370 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
24380 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
24390 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
243a0 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
243b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
243c0 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
243d0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
243e0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
243f0 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
24400 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75  **.** The iIdxCu
24410 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
24420 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
24430 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49   of an index.  I
24440 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  f .** WHERE_ONET
24450 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
24460 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65  , iIdxCur is the
24470 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
24480 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f  f an index.** to
24490 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75   use for OR clau
244a0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
244b0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
244c0 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73   should use this
244d0 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72  .** specific cur
244e0 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f  sor.  If WHERE_O
244f0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69  NEPASS_DESIRED i
24500 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78  s set, then iIdx
24510 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  Cur is.** the fi
24520 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e  rst cursor in an
24530 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72   array of cursor
24540 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
24550 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75  s.  iIdxCur shou
24560 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ld.** be used to
24570 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70   compute the app
24580 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20  ropriate cursor 
24590 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69  depending on whi
245a0 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75  ch index is.** u
245b0 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  sed..*/.WhereInf
245c0 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
245d0 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
245e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
245f0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
24600 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
24610 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
24620 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
24630 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
24640 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
24650 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
24660 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
24670 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24680 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
24690 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
246a0 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
246b0 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
246c0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
246d0 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
246e0 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
246f0 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
24700 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
24710 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
24720 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
24730 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
24740 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
24750 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
24760 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
24770 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
24780 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
24790 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
247a0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
247b0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
247c0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
247d0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
247e0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
247f0 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24810 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
24820 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
24830 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
24840 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
24850 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
24860 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
24870 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
24880 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
24890 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
248a0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
248b0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
248c0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
248d0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
248e0 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
248f0 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
24900 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
24910 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
24920 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
24930 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
24940 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
24950 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
24960 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
24970 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
24980 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
24990 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
249a0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
249b0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
249c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
249d0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
249e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
249f0 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
24a00 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
24a30 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
24a40 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
24a50 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24a60 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
24a70 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24a90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
24aa0 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
24ab0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
24ac0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30  ASS_MULTIROW)==0
24ad0 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77   || (.        (w
24ae0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
24af0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
24b00 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28  D)!=0 .     && (
24b10 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24b20 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
24b30 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20  SE)==0 .  ));.. 
24b40 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
24b50 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
24b60 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
24b70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
24b80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
24b90 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44  ));..  /* An ORD
24ba0 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ER/GROUP BY clau
24bb0 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20  se of more than 
24bc0 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20  63 terms cannot 
24bd0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a  be optimized */.
24be0 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64    testcase( pOrd
24bf0 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
24c00 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29  ->nExpr==BMS-1 )
24c10 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
24c20 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
24c30 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65  xpr>=BMS ) pOrde
24c40 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e  rBy = 0;.  sWLB.
24c50 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
24c60 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
24c70 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
24c80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
24c90 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
24ca0 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
24cb0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
24cc0 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
24cd0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
24ce0 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
24cf0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
24d00 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
24d10 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
24d20 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
24d30 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
24d40 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
24d50 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
24d60 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
24d70 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
24d80 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
24d90 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
24da0 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
24db0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
24dc0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
24dd0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
24de0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
24df0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
24e00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24e10 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
24e20 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
24e30 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
24e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
24e50 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
24e60 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
24e70 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
24e80 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
24e90 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
24ea0 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
24eb0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
24ec0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
24ed0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
24ee0 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
24ef0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
24f00 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
24f10 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
24f20 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
24f30 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
24f40 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
24f50 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
24f60 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
24f70 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
24f80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
24f90 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
24fa0 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
24fb0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
24fc0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
24fd0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
24fe0 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
24ff0 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
25000 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
25010 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
25020 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
25030 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
25040 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
25050 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25060 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
25070 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
25080 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
25090 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
250a0 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
250b0 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
250c0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
250d0 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
250e0 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
250f0 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
25100 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
25110 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
25120 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
25130 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
25140 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
25150 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
25160 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
25170 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
25180 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
25190 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
251a0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
251b0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
251c0 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f  yteWInfo + sizeo
251d0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
251e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
251f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
25200 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25210 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
25220 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
25230 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
25240 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
25250 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
25260 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
25270 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
25280 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
25290 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
252a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
252b0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
252c0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
252d0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
252e0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
252f0 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
25300 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
25310 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
25320 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e  o->iBreak = pWIn
25330 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
25340 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25350 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
25360 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
25370 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
25380 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
25390 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
253a0 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 61 73  nQueryLoop;.  as
253b0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  sert( pWInfo->eO
253c0 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
253d0 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41  OFF );  /* ONEPA
253e0 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f  SS defaults to O
253f0 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74  FF */.  pMaskSet
25400 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
25410 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49  kSet;.  sWLB.pWI
25420 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
25430 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e  sWLB.pWC = &pWIn
25440 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e  fo->sWC;.  sWLB.
25450 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f  pNew = (WhereLoo
25460 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e  p*)(((char*)pWIn
25470 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b  fo)+nByteWInfo);
25480 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
25490 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
254a0 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20  sWLB.pNew) );.  
254b0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57  whereLoopInit(sW
254c0 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66  LB.pNew);.#ifdef
254d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
254e0 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d  sWLB.pNew->cId =
254f0 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   '*';.#endif..  
25500 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
25510 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
25520 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
25530 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
25540 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
25550 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
25560 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
25570 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
25580 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
25590 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  t);.  sqlite3Whe
255a0 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57  reClauseInit(&pW
255b0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66  Info->sWC, pWInf
255c0 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  o);.  sqlite3Whe
255d0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
255e0 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
255f0 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a  _AND);.    .  /*
25600 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
25610 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
25620 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
25630 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
25640 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
25650 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
25660 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
25670 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
25680 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
25690 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e  ; ii<sWLB.pWC->n
256a0 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
256b0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
256c0 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
256d0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
256e0 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d  (sWLB.pWC->a[ii]
256f0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
25700 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
25710 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42  lse(pParse, sWLB
25720 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
25730 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  r, pWInfo->iBrea
25740 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
25750 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25760 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
25770 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e        sWLB.pWC->
25780 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d  a[ii].wtFlags |=
25790 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
257a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65   }.  }..  /* Spe
257b0 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
257c0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
257d0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
257e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
257f0 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
25800 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
25810 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
25820 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
25830 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
25840 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
25850 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
25860 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
25870 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
25880 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
25890 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
258a0 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
258b0 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
258c0 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
258d0 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66  The N-th term of
258e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
258f0 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62   is assigned a b
25900 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a  itmask of 1<<N..
25910 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75    **.  ** The ru
25920 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  le of the previo
25930 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75  us sentence ensu
25940 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73  res thta if X is
25950 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
25960 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c  .  ** a table T,
25970 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65   then X-1 is the
25980 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
25990 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
259a0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a   the left of T..
259b0 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
259c0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
259d0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
259e0 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
259f0 69 6e 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6f 72  in is.  ** impor
25a00 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
25a10 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
25a20 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
25a30 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
25a40 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
25a50 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
25a60 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
25a70 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
25a80 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
25a90 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
25aa0 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
25ab0 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
25ac0 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
25ad0 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
25ae0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
25af0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
25b00 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
25b10 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
25b20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
25b30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
25b40 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
25b50 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
25b60 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
25b70 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46  sqlite3WhereTabF
25b80 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20  uncArgs(pParse, 
25b90 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d  &pTabList->a[ii]
25ba0 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
25bb0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
25bc0 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
25bd0 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
25be0 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
25bf0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73     Bitmask m = s
25c00 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
25c10 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
25c20 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
25c30 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72  rsor);.    asser
25c40 74 28 20 6d 3d 3d 4d 41 53 4b 42 49 54 28 69 69  t( m==MASKBIT(ii
25c50 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) );.  }.#endif.
25c60 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
25c70 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
25c80 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  essions. */.  sq
25c90 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e  lite3WhereExprAn
25ca0 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
25cb0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
25cc0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25cd0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
25ce0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
25cf0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
25d00 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
25d10 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28  TINCT ){.    if(
25d20 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
25d30 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
25d40 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
25d50 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29  sWC, pResultSet)
25d60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
25d70 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
25d80 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
25d90 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
25da0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
25db0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
25dc0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
25dd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
25de0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
25df0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
25e00 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
25e10 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
25e20 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
25e30 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
25e40 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
25e50 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
25e60 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
25e70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
25e80 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
25e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
25ea0 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
25eb0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
25ec0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
25ed0 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
25ee0 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28  izer Start *** (
25ef0 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78  wctrlFlags: 0x%x
25f00 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
25f10 20 20 20 77 63 74 72 6c 46 6c 61 67 73 29 29 3b     wctrlFlags));
25f20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
25f30 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
25f40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
25f50 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
25f60 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61   ){ /* Display a
25f70 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
25f80 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
25f90 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
25fa0 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70  or(i=0; i<sWLB.p
25fb0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  WC->nTerm; i++){
25fc0 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d  .      whereTerm
25fd0 50 72 69 6e 74 28 26 73 57 4c 42 2e 70 57 43 2d  Print(&sWLB.pWC-
25fe0 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d  >a[i], i);.    }
25ff0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
26000 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
26010 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
26020 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
26030 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
26040 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
26050 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26060 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
26070 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45  .  .#ifdef WHERE
26080 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
26090 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
260a0 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a  reTrace ){    /*
260b0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
260c0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
260d0 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57  jects */.      W
260e0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
260f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
26100 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
26110 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
26120 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
26130 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
26140 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
26180 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
26190 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
261a0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
261b0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
261c0 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
261d0 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
261e0 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
261f0 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
26200 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
26210 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
26220 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
26230 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
26240 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
26250 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
26260 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
26270 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
26280 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
26290 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
262a0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
262b0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
262c0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
262d0 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
262e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
262f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
26300 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
26310 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
26320 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
26330 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
26340 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
26350 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
26360 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d  >revMask = (Bitm
26370 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20  ask)(-1);.  }.  
26380 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
26390 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
263a0 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
263b0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
263c0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
263d0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
263e0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
263f0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
26400 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
26410 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
26420 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
26430 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
26440 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
26450 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  fo->nOBSat>0 ){.
26460 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26470 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
26480 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70  BY=%d,0x%llx", p
26490 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70  WInfo->nOBSat, p
264a0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
264b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
264c0 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
264d0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
264e0 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
264f0 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
26500 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26510 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
26520 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
26530 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26540 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
26550 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
26560 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
26570 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
26580 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
26590 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
265a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
265b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
265c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
265d0 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
265e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
265f0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
26600 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
26610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
26630 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26640 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
26650 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
26660 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
26670 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
26680 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
26690 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e  i].pWLoop, sWLB.
266a0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pWC);.    }.  }.
266b0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65  #endif.  /* Atte
266c0 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c  mpt to omit tabl
266d0 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e  es from the join
266e0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66   that do not eff
266f0 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a  ect the result *
26700 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
26710 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
26720 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20  pResultSet!=0.  
26730 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
26740 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
26750 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29  TE_OmitNoopJoin)
26760 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
26770 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69  k tabUsed = sqli
26780 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74  te3WhereExprList
26790 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
267a0 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20  pResultSet);.   
267b0 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72   if( sWLB.pOrder
267c0 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55  By ){.      tabU
267d0 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  sed |= sqlite3Wh
267e0 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65  ereExprListUsage
267f0 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
26800 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  pOrderBy);.    }
26810 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
26820 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b  fo->nLevel>=2 ){
26830 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
26840 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
26850 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
26860 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
26870 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70  nLevel-1].pWLoop
26880 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  ;.      if( (pWI
26890 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
268a0 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67  [pLoop->iTab].fg
268b0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
268c0 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  EFT)==0 ) break;
268d0 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72  .      if( (wctr
268e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
268f0 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30  ANT_DISTINCT)==0
26900 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
26910 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
26920 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20  RE_ONEROW)==0.  
26930 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
26940 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26950 20 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64      if( (tabUsed
26960 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
26970 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  lf)!=0 ) break;.
26980 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c        pEnd = sWL
26990 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e  B.pWC->a + sWLB.
269a0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
269b0 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42    for(pTerm=sWLB
269c0 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  .pWC->a; pTerm<p
269d0 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
269e0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
269f0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
26a00 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
26a10 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  =0.         && !
26a20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a30 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
26a40 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
26a50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26a60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
26a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26a80 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20  f( pTerm<pEnd ) 
26a90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45  break;.      WHE
26aa0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20  RETRACE(0xffff, 
26ab0 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25  ("-> drop loop %
26ac0 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70  c not used\n", p
26ad0 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20  Loop->cId));.   
26ae0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65     pWInfo->nLeve
26af0 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c  l--;.      nTabL
26b00 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ist--;.    }.  }
26b10 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
26b20 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
26b30 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
26b40 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f  *\n"));.  pWInfo
26b50 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  ->pParse->nQuery
26b60 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e  Loop += pWInfo->
26b70 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  nRowOut;..  /* I
26b80 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
26b90 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
26ba0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
26bb0 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
26bc0 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
26bd0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
26be0 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
26bf0 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
26c00 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
26c10 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
26c20 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
26c30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
26c40 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20  constrains.  ** 
26c50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
26c60 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
26c70 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a  e a single row..
26c80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
26c90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26ca0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
26cb0 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
26cc0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
26cd0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
26ce0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
26cf0 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a  _DESIRED)!=0 ){.
26d00 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
26d10 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  = pWInfo->a[0].p
26d20 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
26d30 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20      int bOnerow 
26d40 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  = (wsFlags & WHE
26d50 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20  RE_ONEROW)!=0;. 
26d60 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c     if( bOnerow |
26d70 7c 20 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  | ( (wctrlFlags 
26d80 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
26d90 4d 55 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 20  MULTIROW).      
26da0 20 26 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20   && 0==(wsFlags 
26db0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
26dc0 41 42 4c 45 29 0a 20 20 20 20 29 29 7b 0a 20 20  ABLE).    )){.  
26dd0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65      pWInfo->eOne
26de0 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f  Pass = bOnerow ?
26df0 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20   ONEPASS_SINGLE 
26e00 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b  : ONEPASS_MULTI;
26e10 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
26e20 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  wid(pTabList->a[
26e30 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
26e40 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
26e50 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
26e60 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
26e70 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
26e80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65   }.  }..  /* Ope
26e90 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
26ea0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
26eb0 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
26ec0 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
26ed0 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
26ee0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
26ef0 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
26f00 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
26f10 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
26f20 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
26f30 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
26f40 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
26f50 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
26f60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
26f70 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
26f80 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
26f90 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
26fa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
26fb0 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61  abItem;..    pTa
26fc0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
26fd0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
26fe0 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
26ff0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
27000 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
27010 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
27020 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
27030 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
27040 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
27050 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
27060 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
27070 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
27080 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
27090 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
270a0 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g */.    }else.#
270b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
270c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
270d0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
270e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
270f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
27100 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
27110 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
27120 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
27130 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
27140 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
27150 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
27160 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
27170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27180 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
27190 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
271a0 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
271b0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
271c0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
271d0 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a       /* noop */.
271e0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
271f0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
27200 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27210 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
27220 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
27230 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
27240 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
27250 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
27260 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
27270 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
27280 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
27290 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
272a0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
272b0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
272c0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
272d0 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
272e0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
272f0 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
27300 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
27310 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
27320 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
27330 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
27340 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
27350 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
27360 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
27370 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
27380 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
27390 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
273a0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
273b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
273c0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
273d0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
273e0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
273f0 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  S );.      if( p
27400 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
27410 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
27420 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
27430 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
27440 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
27450 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
27460 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
27470 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
27480 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
27490 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
274a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
274b0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
274c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
274d0 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
27500 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
27510 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
27520 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
27530 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
27540 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
27550 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
27560 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c  D_MASK.      sql
27570 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
27580 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
27590 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e  Used, pTabItem->
275a0 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20  iCursor, 0, 0,. 
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275c0 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
275d0 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d  t u8*)&pTabItem-
275e0 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  >colUsed, P4_INT
275f0 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
27600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
27610 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
27620 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
27630 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
27640 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
27650 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
27660 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
27670 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
27680 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
27690 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
276a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  ;.      int iInd
276b0 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74  exCur;.      int
276c0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
276d0 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49 64 78  d;.      /* iIdx
276e0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 73 65  Cur is always se
276f0 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69  t if to a positi
27700 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50  ve value if ONEP
27710 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ASS is possible 
27720 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
27730 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c 20 28   iIdxCur!=0 || (
27740 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27750 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
27760 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29  SS_DESIRED)==0 )
27770 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73  ;.      if( !Has
27780 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 49  Rowid(pTab) && I
27790 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
277a0 28 70 49 78 29 0a 20 20 20 20 20 20 20 26 26 20  (pIx).       && 
277b0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
277c0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
277d0 59 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  Y)!=0.      ){. 
277e0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
277f0 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e  s one term of an
27800 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR-optimization
27810 20 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41   using the PRIMA
27820 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20  RY KEY of a.    
27830 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52      ** WITHOUT R
27840 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20  OWID table.  No 
27850 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70 61 72  need for a separ
27860 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ate index */.   
27870 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
27880 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
27890 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30  ;.        op = 0
278a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
278b0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
278c0 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss!=ONEPASS_OFF 
278d0 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
278e0 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d   *pJ = pTabItem-
278f0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
27900 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
27910 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
27920 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72      assert( wctr
27930 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
27940 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29  NEPASS_DESIRED )
27950 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
27960 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70   ALWAYS(pJ) && p
27970 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20  J!=pIx ){.      
27980 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b      iIndexCur++;
27990 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20  .          pJ = 
279a0 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  pJ->pNext;.     
279b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20     }.        op 
279c0 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
279d0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
279e0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
279f0 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
27a00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64     }else if( iId
27a10 78 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c  xCur && (wctrlFl
27a20 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
27a30 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  ABLE_ONLY)!=0 ){
27a40 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
27a50 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  ur = iIdxCur;.  
27a60 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46        if( wctrlF
27a70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 4f  lags & WHERE_REO
27a80 50 45 4e 5f 49 44 58 20 29 20 6f 70 20 3d 20 4f  PEN_IDX ) op = O
27a90 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20  P_ReopenIdx;.   
27aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27ab0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
27ac0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
27ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
27ae0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
27af0 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
27b00 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
27b10 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
27b20 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
27b30 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
27b40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
27b50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27b60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27b70 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20   op, iIndexCur, 
27b80 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  pIx->tnum, iDb);
27b90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27ba0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
27bb0 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
27bc0 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f         if( (pLoo
27bd0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27be0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
27bf0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
27c00 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
27c10 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
27c20 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43  NGE|WHERE_SKIPSC
27c30 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  AN))==0.        
27c40 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
27c50 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
27c60 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20  DERBY_MIN)==0.  
27c70 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
27c90 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
27ca0 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e  _SEEKEQ); /* Hin
27cb0 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20  t to COMDB2 */. 
27cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27cd0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27ce0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
27cf0 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  e));.#ifdef SQLI
27d00 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
27d10 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
27d20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
27d30 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a  64 colUsed = 0;.
27d40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
27d50 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  , jj;.          
27d60 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78  for(ii=0; ii<pIx
27d70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29  ->nColumn; ii++)
27d80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  {.            jj
27d90 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e   = pIx->aiColumn
27da0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [ii];.          
27db0 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e    if( jj<0 ) con
27dc0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27dd0 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a     if( jj>63 ) j
27de0 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20  j = 63;.        
27df0 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65      if( (pTabIte
27e00 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  m->colUsed & MAS
27e10 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63  KBIT(jj))==0 ) c
27e20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27e30 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
27e40 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33  ((u64)1)<<(ii<63
27e50 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20   ? ii : 63);.   
27e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27e80 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
27e90 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64  olumnsUsed, iInd
27ea0 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20  exCur, 0, 0,.   
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 38               (u8
27ed0 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49  *)&colUsed, P4_I
27ee0 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  NT64);.        }
27ef0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
27f00 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
27f10 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20  USED_MASK */.   
27f20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
27f30 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69  f( iDb>=0 ) sqli
27f40 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
27f50 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
27f60 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
27f70 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
27f80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
27f90 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
27fa0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
27fb0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
27fc0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
27fd0 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
27fe0 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
27ff0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
28000 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
28010 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
28020 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
28030 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
28040 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
28050 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
28060 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
28070 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
28080 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
28090 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  ++){.    int add
280a0 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e  rExplain;.    in
280b0 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  t wsFlags;.    p
280c0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
280d0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c  >a[ii];.    wsFl
280e0 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  ags = pLevel->pW
280f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23  Loop->wsFlags;.#
28100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28110 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
28120 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
28130 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
28140 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
28150 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
28160 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
28170 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
28180 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
28190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
281a0 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70    &pTabList->a[p
281b0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e  Level->iFrom], n
281c0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
281d0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
281e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
281f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
28200 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ror;.    }.#endi
28210 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69  f.    addrExplai
28220 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  n = sqlite3Where
28230 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  ExplainOneScan(.
28240 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
28250 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
28260 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
28270 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a  rom, wctrlFlags.
28280 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65      );.    pLeve
28290 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71  l->addrBody = sq
282a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
282b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74  Addr(v);.    not
282c0 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57  Ready = sqlite3W
282d0 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53  hereCodeOneLoopS
282e0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
282f0 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
28300 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
28310 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
28320 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77  Cont;.    if( (w
28330 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  sFlags&WHERE_MUL
28340 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63  TI_OR)==0 && (wc
28350 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
28360 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30  NETABLE_ONLY)==0
28370 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28380 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61  3WhereAddScanSta
28390 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c  tus(v, pTabList,
283a0 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70   pLevel, addrExp
283b0 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lain);.    }.  }
283c0 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
283d0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
283e0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
283f0 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
28400 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
28410 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
28420 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
28430 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
28440 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
28450 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
28460 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
28470 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
28480 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
28490 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
284a0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
284b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
284c0 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
284d0 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
284e0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
284f0 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
28500 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
28510 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
28520 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
28530 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
28540 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
28550 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
28560 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
28570 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
28580 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
28590 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
285a0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
285b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
285c0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
285d0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
285e0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
285f0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
28600 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
28610 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
28620 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
28630 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
28640 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
28650 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
28660 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
28670 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
28680 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
28690 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
286a0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
286b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
286c0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
286d0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
286e0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
286f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28700 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
28710 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
28720 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
28730 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
28740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28750 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p3(v, pLevel->op
28760 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
28770 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c  evel->p2, pLevel
28780 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p3);.      sql
28790 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
287a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
287b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
287c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
287d0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
287e0 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e  pLevel->op==OP_N
287f0 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ext);.      Vdbe
28800 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
28810 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65  evel->op==OP_Pre
28820 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
28830 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
28840 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74  el->op==OP_VNext
28850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
28860 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
28870 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
28880 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
28890 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
288a0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
288b0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
288c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
288d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
288e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
288f0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
28900 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
28910 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
28920 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
28930 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
28940 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28950 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28960 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
28970 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
28980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28990 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
289a0 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  p, pIn->iCur, pI
289b0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
289c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
289d0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
289e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
289f0 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
28a00 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  p==OP_PrevIfOpen
28a10 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
28a20 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
28a30 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
28a40 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20  _NextIfOpen);.  
28a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28a60 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
28a70 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
28a80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28aa0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
28ab0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
28ac0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
28ad0 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  ddrSkip ){.     
28ae0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
28af0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
28b00 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62  Skip);.      Vdb
28b10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
28b20 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20  xt skip-scan on 
28b30 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  %s", pLoop->u.bt
28b40 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
28b50 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
28b60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28b70 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
28b80 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ip);.      sqlit
28b90 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28ba0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
28bb0 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ip-2);.    }.   
28bc0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
28bd0 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20  rLikeRep ){.    
28be0 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20    int op;.      
28bf0 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  if( sqlite3VdbeG
28c00 65 74 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  etOp(v, pLevel->
28c10 61 64 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e  addrLikeRep-1)->
28c20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  p1 ){.        op
28c30 20 3d 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65   = OP_DecrJumpZe
28c40 72 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ro;.      }else{
28c50 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
28c60 5f 4a 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20  _JumpZeroIncr;. 
28c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
28c80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28c90 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  , op, pLevel->iL
28ca0 69 6b 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76  ikeRepCntr, pLev
28cb0 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29  el->addrLikeRep)
28cc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28cd0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
28ce0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
28cf0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
28d00 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
28d10 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28d20 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
28d30 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
28d40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
28d50 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
28d60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28d70 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
28d80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
28d90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
28da0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
28db0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
28dc0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
28dd0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
28de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
28df0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
28e00 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
28e10 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
28e20 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
28e30 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
28e40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28e50 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
28e60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28e70 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
28e80 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
28e90 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
28ea0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
28eb0 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
28ec0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28ee0 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
28ef0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
28f00 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
28f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
28f20 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
28f30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
28f40 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
28f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28f60 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
28f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
28f80 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
28f90 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
28fa0 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
28fd0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
28fe0 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
28ff0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
29000 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
29010 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
29020 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
29030 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
29040 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
29050 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29060 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
29070 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
29080 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
29090 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
290a0 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
290b0 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
290c0 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
290d0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
290e0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
290f0 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
29100 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
29110 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
29120 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
29130 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
29140 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
29150 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
29160 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
29170 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
29180 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
29190 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
291a0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
291b0 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
291c0 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
291d0 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
291e0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
291f0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
29200 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
29210 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43  outine into OP_C
29220 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  opy of result co
29230 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67  ntained in a reg
29240 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50  ister..    ** OP
29250 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f  _Rowid becomes O
29260 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  P_Null..    */. 
29270 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
29280 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
29290 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
292a0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74  ailed ){.      t
292b0 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
292c0 43 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Copy(v, pLevel->
292d0 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c  addrBody, pLevel
292e0 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  ->iTabCur,.     
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d         pTabItem-
29310 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a  >regResult, 0);.
29320 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
29330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c      }..    /* Cl
29340 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
29350 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
29360 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
29370 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
29380 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
29390 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72  not close cursor
293a0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
293b0 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20  eused by the OR 
293c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
293d0 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f   ** (WHERE_OMIT_
293e0 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e  OPEN_CLOSE).  An
293f0 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74  d do not close t
29400 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  he OP_OpenWrite 
29410 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63  cursors.    ** c
29420 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f  reated for the O
29430 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
29440 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
29450 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
29460 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
29470 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
29480 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
29490 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
294a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
294b0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
294c0 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  OSE)==0.    ){. 
294d0 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c       int ws = pL
294e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
294f0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
29500 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
29510 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20 57  S_OFF && (ws & W
29520 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
29530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
29540 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29550 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
29560 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
29570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29580 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
29590 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
295a0 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45   && (ws & (WHERE
295b0 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f  _IPK|WHERE_AUTO_
295c0 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20  INDEX))==0 .    
295d0 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49     && pLevel->iI
295e0 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61  dxCur!=pWInfo->a
295f0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20  iCurOnePass[1]. 
29600 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29620 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
29630 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
29640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
29650 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
29660 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
29670 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64  x, make VDBE cod
29680 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
29690 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
296a0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
296b0 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72  ex instead of fr
296c0 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65  om the table whe
296d0 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e  re possible.  In
296e0 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20   some cases.    
296f0 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** this optimiza
29700 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68  tion prevents th
29710 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65  e table from eve
29720 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68  r being read, wh
29730 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79  ich can.    ** y
29740 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61  ield a significa
29750 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  nt performance b
29760 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  oost..    ** .  
29770 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
29780 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
29790 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
297a0 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
297b0 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
297c0 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
297d0 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
297e0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
297f0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
29800 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
29810 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
29820 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
29830 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
29840 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
29850 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
29860 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
29870 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
29880 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
29890 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
298a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
298b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
298c0 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
298d0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a  RE_IDX_ONLY) ){.
298e0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
298f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
29900 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ex;.    }else if
29910 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
29920 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
29930 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  R ){.      pIdx 
29940 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  = pLevel->u.pCov
29950 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  idx;.    }.    i
29960 66 28 20 70 49 64 78 0a 20 20 20 20 20 26 26 20  f( pIdx.     && 
29970 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73  (pWInfo->eOnePas
29980 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c  s==ONEPASS_OFF |
29990 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78  | !HasRowid(pIdx
299a0 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20  ->pTable)).     
299b0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
299c0 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20  iled.    ){.    
299d0 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
299e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
299f0 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c  v);.      k = pL
29a00 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a  evel->addrBody;.
29a10 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
29a20 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
29a30 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  k);.      for(; 
29a40 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
29a50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
29a60 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
29a70 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
29a80 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
29a90 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
29aa0 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
29ab0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f        int x = pO
29ac0 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20  p->p2;.         
29ad0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
29ae0 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
29af0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61           if( !Ha
29b00 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
29b10 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
29b20 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
29b30 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
29b40 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
29b50 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f     x = pPk->aiCo
29b60 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20  lumn[x];.       
29b70 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
29b80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0 );.          }
29b90 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
29ba0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
29bb0 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20  dex(pIdx, x);.  
29bc0 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30          if( x>=0
29bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29be0 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20  pOp->p2 = x;.   
29bf0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
29c00 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
29c10 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ur;.          }.
29c20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29c30 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
29c40 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
29c50 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29  LY)==0 || x>=0 )
29c60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
29c70 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
29c80 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
29c90 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
29ca0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
29cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
29cc0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
29cd0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
29ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29cf0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
29d00 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
29d10 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
29d20 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
29d30 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
29d40 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
29d50 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
29d60 6e 3b 0a 7d 0a                                   n;.}.