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

Artifact 0bb01a0545afb9ee064d64e4821f34a79742a6cf:


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 2c 20 61 6e 64 20 4f  o OP_Copy, and O
40a0: 50 5f 52 6f 77 69 64 20 69 6e 74 6f 20 4f 50 5f  P_Rowid into OP_
40b0: 4e 75 6c 6c 2c 20 77 68 65 6e 20 74 68 65 20 74  Null, when the t
40c0: 61 62 6c 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  able is being.**
40d0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
40e0: 2d 72 6f 75 74 69 6e 65 20 69 6e 73 74 65 61 64  -routine instead
40f0: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4100: 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  okup..*/.static 
4110: 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f  void translateCo
4120: 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64  lumnToCopy(.  Vd
4130: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4140: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f    /* The VDBE co
4150: 6e 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f  ntaining code to
4160: 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20   translate */.  
4170: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
4180: 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65      /* Translate
4190: 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64   from this opcod
41a0: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  e to the end */.
41b0: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
41c0: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75        /* OP_Colu
41d0: 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65  mn/OP_Rowid refe
41e0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
41f0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
4200: 65 67 69 73 74 65 72 20 20 20 20 20 20 20 2f 2a  egister       /*
4210: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   The first colum
4220: 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67  n is in this reg
4230: 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 56 64  ister */.){.  Vd
4240: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
4250: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
4260: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
4270: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
4280: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4290: 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c  .  for(; iStart<
42a0: 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20  iEnd; iStart++, 
42b0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pOp++){.    if( 
42c0: 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72  pOp->p1!=iTabCur
42d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
42e0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
42f0: 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
4300: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4310: 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20   = OP_Copy;.    
4320: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d    pOp->p1 = pOp-
4330: 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b  >p2 + iRegister;
4340: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
4350: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
4360: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20  pOp->p3 = 0;.   
4370: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
4380: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
4390: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f   ){.      pOp->o
43a0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
43b0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d  .      pOp->p1 =
43c0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   0;.      pOp->p
43d0: 33 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  3 = 0;.    }.  }
43e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
43f0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
4400: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
4410: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
4420: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
4430: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
4440: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
4450: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
4460: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
4470: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
4480: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
4490: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
44a0: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
44b0: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
44c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
44d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
44e0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
44f0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
4500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
4510: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
4520: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
4530: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
4540: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
4550: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
4560: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4570: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
4580: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4590: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
45a0: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
45b0: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
45c0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
45d0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
45e0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
45f0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
4600: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
4610: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
4620: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
4630: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
4640: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
4650: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
4660: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
4670: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
4680: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
4690: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
46a0: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
46b0: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
46c0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
46d0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
46e0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
46f0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
4700: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
4710: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
4720: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
4730: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
4740: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
4750: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
4760: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
4770: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4780: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
4790: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
47a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
47b0: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
47c0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
47d0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
47e0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
47f0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
4800: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
4810: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
4820: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
4830: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4840: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
4850: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
4860: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
4870: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
4880: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
4890: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
48a0: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
48b0: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
48c0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
48d0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
48e0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
48f0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
4900: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
4910: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
4920: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
4930: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
4940: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
4950: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
4960: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
4970: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
4980: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
4990: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
49a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
49b0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
49c0: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
49d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
49e0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
49f0: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
4a00: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
4a10: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
4a20: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
4a30: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
4a40: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
4a50: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
4a60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
4a70: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
4a80: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
4a90: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
4aa0: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
4ab0: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
4ac0: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
4ad0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
4ae0: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
4af0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
4b00: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
4b10: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b30: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
4b40: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
4b50: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
4b60: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
4b70: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
4b80: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
4b90: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
4ba0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
4bb0: 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d   (WO_EQ|WO_IS))=
4bc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4bd0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
4be0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
4bf0: 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ady)!=0 ) return
4c00: 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d   0;.  if( pTerm-
4c10: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20  >u.leftColumn<0 
4c20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66  ) return 0;.  af
4c30: 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  f = pSrc->pTab->
4c40: 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65  aCol[pTerm->u.le
4c50: 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  ftColumn].affini
4c60: 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  ty;.  if( !sqlit
4c70: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
4c80: 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  k(pTerm->pExpr, 
4c90: 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  aff) ) return 0;
4ca0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65  .  testcase( pTe
4cb0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rm->pExpr->op==T
4cc0: 4b 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72 6e  K_IS );.  return
4cd0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23   1;.}.#endif...#
4ce0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4cf0: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
4d00: 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
4d10: 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
4d20: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
4d30: 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
4d40: 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
4d50: 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
4d60: 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
4d70: 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
4d80: 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
4d90: 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
4da0: 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
4db0: 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
4dc0: 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
4dd0: 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
4de0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4df0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4e00: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
4e10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
4e20: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
4e40: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
4e50: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4e60: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
4e70: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
4e80: 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
4e90: 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
4ea0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4eb0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
4ec0: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
4ed0: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
4ee0: 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
4ef0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
4f00: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
4f10: 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
4f20: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43  /.){.  int nKeyC
4f30: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
4f40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4f50: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
4f60: 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
4f70: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
4f80: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
4f90: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
4fa0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
4fb0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4fc0: 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
4fd0: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
4fe0: 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
4ff0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5010: 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
5020: 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
5030: 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
5040: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
5050: 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
5060: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
5070: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
5080: 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
50b0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
50c0: 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
50d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50f0: 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
5100: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
5110: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
5120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
5130: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69   of the index fi
5140: 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ll loop */.  int
5150: 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
5160: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
5170: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20  ster holding an 
5180: 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
5190: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20   Column counter 
51c0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43   */.  int mxBitC
5200: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
5210: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c    /* Maximum col
5220: 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c  umn in pSrc->col
5230: 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  Used */.  CollSe
5240: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
5250: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
5260: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f  ng sequence to o
5270: 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  n a column */.  
5280: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
5290: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
52a0: 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  he Loop object *
52b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73  /.  char *zNotUs
52c0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
52d0: 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f  /* Extra space o
52e0: 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64  n the end of pId
52f0: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  x */.  Bitmask i
5300: 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
5310: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
5320: 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
5330: 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
5340: 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
5350: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
5360: 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
5370: 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  al columns */.  
5380: 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d  u8 sentWarning =
5390: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
53a0: 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e  rue if a warnnin
53b0: 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65  g has been issue
53c0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 61  d */.  Expr *pPa
53d0: 72 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  rtial = 0;      
53e0: 20 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49 6e     /* Partial In
53f0: 64 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20 2a  dex Expression *
5400: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
5410: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
5420: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5430: 73 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72 6f  skip excluded ro
5440: 77 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ws */.  struct S
5450: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
5460: 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
5470: 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
5480: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  g indexed */..  
5490: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
54a0: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
54b0: 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
54c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
54d0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
54e0: 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
54f0: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
5500: 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
5510: 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
5520: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5530: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
5540: 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73  ;.  addrInit = s
5550: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
5560: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
5570: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
5580: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
5590: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
55a0: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
55b0: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
55c0: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
55d0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
55e0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
55f0: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
5600: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
5610: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
5620: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
5630: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
5640: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
5650: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
5660: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
5670: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
5680: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
5690: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
56a0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
56b0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
56c0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
56d0: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
56e0: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
56f0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
5700: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
5710: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
5720: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
5730: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
5740: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
5750: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
5760: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5780: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
5790: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
57a0: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
57b0: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
57c0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
57d0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
57e0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
57f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
5800: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
5810: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
5820: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
5830: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
5840: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
5850: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
5860: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
5870: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  >db, pPartial,. 
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
58a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
58b0: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
58c0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
58d0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
58e0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
58f0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
5900: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
5910: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
5920: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
5930: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
5940: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
5950: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
5960: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
5970: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
5980: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
5990: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
59a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
59b0: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
59c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
59d0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
59e0: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
59f0: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
5a00: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
5a10: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
5a20: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
5a30: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
5a40: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
5a50: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
5a60: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
5a70: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
5a80: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
5a90: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
5aa0: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
5ab0: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
5ac0: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
5ad0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
5ae0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
5af0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b00: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
5b10: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
5b20: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
5b30: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
5b40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5b50: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
5b60: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
5b70: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
5b80: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
5b90: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
5ba0: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
5bb0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
5bc0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
5bd0: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
5c00: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
5c10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
5c20: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5c30: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
5c40: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
5c50: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
5c60: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
5c70: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
5c80: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
5c90: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
5ca0: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
5cb0: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
5cc0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
5cd0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
5ce0: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
5cf0: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
5d00: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
5d10: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
5d20: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
5d30: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
5d40: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
5d50: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
5d60: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
5d70: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
5d80: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
5d90: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
5da0: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
5db0: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
5dc0: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
5dd0: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
5de0: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
5df0: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
5e00: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
5e10: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
5e20: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
5e30: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
5e40: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
5e50: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
5e60: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
5e70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
5e80: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
5e90: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
5ea0: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
5eb0: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
5ec0: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
5ed0: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
5ee0: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
5ef0: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
5f00: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
5f10: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
5f20: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
5f30: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
5f40: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
5f50: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
5f60: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
5f70: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
5f80: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
5f90: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
5fa0: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
5fb0: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
5fc0: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
5fd0: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
5fe0: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
5ff0: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6000: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
6010: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
6020: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
6030: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
6040: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
6050: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
6060: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
6070: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
6080: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
6090: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
60a0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
60b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
60c0: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
60d0: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
60e0: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
60f0: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
6100: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6110: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
6120: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6130: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
6140: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
6150: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6160: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
6170: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
6180: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
6190: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
61a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
61b0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
61c0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
61d0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
61e0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
61f0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
6200: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
6210: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
6220: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
6230: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
6240: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
6250: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
6260: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6270: 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
6280: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
6290: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
62a0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
62b0: 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
62c0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
62d0: 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
62e0: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
62f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
6300: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
6310: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6320: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
6330: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
6340: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
6350: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
6360: 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
6370: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
6380: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
6390: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
63a0: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
63b0: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
63c0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
63d0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
63e0: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
63f0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
6400: 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
6410: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
6420: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6430: 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20  n==nKeyCol );.  
6440: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
6450: 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  ] = XN_ROWID;.  
6460: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6470: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f  = "BINARY";..  /
6480: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
6490: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
64a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
64b0: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
64c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
64d0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
64e0: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
64f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
6500: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
6510: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
6520: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
6530: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
6540: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
6550: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
6560: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
6570: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
6580: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
6590: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
65a0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
65b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
65c0: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
65d0: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43   pTabItem = &pWC
65e0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ->pWInfo->pTabLi
65f0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
6600: 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62  rom];.  if( pTab
6610: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
6620: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
6630: 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
6640: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
6650: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6660: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
6670: 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  tCoroutine, regY
6680: 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65  ield, 0, pTabIte
6690: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
66a0: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 20  .    addrTop =  
66b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
66c0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
66d0: 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64  egYield);.    Vd
66e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
66f0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
6700: 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
6710: 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65  \"%s\"", pTabIte
6720: 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
6730: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6740: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
6750: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6760: 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d  _Rewind, pLevel-
6770: 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62 65 43  >iTabCur); VdbeC
6780: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
6790: 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20 29    if( pPartial )
67a0: 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20  {.    iContinue 
67b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
67c0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73  eLabel(v);.    s
67d0: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
67e0: 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 69  e(pParse, pParti
67f0: 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53  al, iContinue, S
6800: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
6810: 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
6820: 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50  Flags |= WHERE_P
6830: 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20  ARTIALIDX;.  }. 
6840: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
6850: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6860: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
6870: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
6880: 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
6890: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
68a0: 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30   regRecord, 0, 0
68b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
68c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
68d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
68e0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
68f0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
6900: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6910: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
6920: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28  EKRESULT);.  if(
6930: 20 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69   pPartial ) sqli
6940: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6950: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
6960: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  );.  if( pTabIte
6970: 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
6980: 6e 65 20 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c  ne ){.    transl
6990: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
69a0: 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76  v, addrTop, pLev
69b0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61  el->iTabCur, pTa
69c0: 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
69d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
69e0: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
69f0: 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  p);.    pTabItem
6a00: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
6a10: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
6a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
6a40: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
6a50: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56  r, addrTop+1); V
6a60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6a70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
6a80: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
6a90: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
6aa0: 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
6ab0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
6ac0: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
6ad0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6ae0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6af0: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
6b00: 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
6b10: 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a  pParse);.  .  /*
6b20: 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20   Jump here when 
6b30: 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
6b40: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
6b50: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6b60: 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74  Here(v, addrInit
6b70: 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64  );..end_auto_ind
6b80: 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c  ex_create:.  sql
6b90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6ba0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74  Parse->db, pPart
6bb0: 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ial);.}.#endif /
6bc0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
6bd0: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
6be0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6bf0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6c00: 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  LE./*.** Allocat
6c10: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
6c20: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
6c30: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
6c40: 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
6c50: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
6c60: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
6c70: 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
6c80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a   the structure.*
6c90: 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65  * by passing the
6ca0: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
6cb0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
6cc0: 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  on to sqlite3_fr
6cd0: 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
6ce0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
6cf0: 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65  fo *allocateInde
6d00: 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a  xInfo(.  Parse *
6d10: 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43  pParse,.  WhereC
6d20: 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69  lause *pWC,.  Bi
6d30: 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c  tmask mUnusable,
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6d50: 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69   Ignore terms wi
6d60: 74 68 20 74 68 65 73 65 20 70 72 65 72 65 71 73  th these prereqs
6d70: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
6d80: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
6d90: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
6da0: 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69  derBy.){.  int i
6db0: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , j;.  int nTerm
6dc0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
6dd0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
6de0: 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
6df0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
6e00: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
6e10: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
6e20: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
6e30: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
6e40: 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
6e50: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
6e60: 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
6e70: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
6e80: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
6e90: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
6ea0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
6eb0: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
6ec0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
6ed0: 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
6ee0: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
6ef0: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
6f00: 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
6f10: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
6f20: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
6f30: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
6f40: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
6f50: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
6f60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
6f70: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
6f80: 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29  ht & mUnusable )
6f90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
6fa0: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
6fb0: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
6fc0: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
6fd0: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
6fe0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
6ff0: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
7000: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7010: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7020: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
7030: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7040: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7050: 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IS );.    testc
7060: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7070: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
7080: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
7090: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
70a0: 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
70b0: 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  IV|WO_IS))==0 ) 
70c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
70d0: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
70e0: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
70f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
7100: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c  sert( pTerm->u.l
7110: 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20  eftColumn>=(-1) 
7120: 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  );.    nTerm++;.
7130: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
7140: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7150: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
7160: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
7170: 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
7180: 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
7190: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
71a0: 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
71b0: 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
71c0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
71d0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
71e0: 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
71f0: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
7200: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  y ){.    int n =
7210: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
7220: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
7230: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
7240: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
7250: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
7260: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
7270: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
7280: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
7290: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
72a0: 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
72b0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b  }.    if( i==n){
72c0: 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
72d0: 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = n;.    }.  }..
72e0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
72f0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7300: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
7310: 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
7320: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7330: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
7340: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
7350: 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
7370: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
7380: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
7390: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
73c0: 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
73d0: 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
73e0: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
73f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7400: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
7410: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
7420: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
7430: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
7440: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
7450: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
7460: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7470: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d   contains.  ** m
7480: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
7490: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
74a0: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
74b0: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
74c0: 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
74d0: 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
74e0: 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
74f0: 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
7500: 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  o.  ** initializ
7510: 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  e those fields..
7520: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
7530: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
7540: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7550: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  nt*)&pIdxInfo[1]
7560: 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20  ;.  pIdxOrderBy 
7570: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
7580: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
7590: 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d  )&pIdxCons[nTerm
75a0: 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73  ];.  pUsage = (s
75b0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
75c0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
75d0: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
75e0: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
75f0: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
7600: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
7610: 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29  nTerm;.  *(int*)
7620: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
7630: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
7640: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
7650: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7660: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
7670: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70  >aConstraint = p
7680: 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72  IdxCons;.  *(str
7690: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
76a0: 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64  x_orderby**)&pId
76b0: 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20  xInfo->aOrderBy 
76c0: 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20  = pIdxOrderBy;. 
76d0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
76e0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
76f0: 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78  nt_usage**)&pIdx
7700: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
7710: 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  tUsage =.       
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61              pUsa
7760: 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ge;..  for(i=j=0
7770: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
7780: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
7790: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
77a0: 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20   u8 op;.    if( 
77b0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
77c0: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
77d0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
77e0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
77f0: 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75  ereqRight & mUnu
7800: 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65  sable ) continue
7810: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
7820: 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
7830: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
7840: 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
7850: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7860: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7870: 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
7880: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7890: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
78a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
78b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
78c0: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
78d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
78e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
78f0: 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  O_ALL );.    if(
7900: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
7910: 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c  or & ~(WO_ISNULL
7920: 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29  |WO_EQUIV|WO_IS)
7930: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
7940: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
7950: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7960: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
7970: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
7980: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
7990: 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49  >=(-1) );.    pI
79a0: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
79b0: 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
79c0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
79d0: 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
79e0: 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70  fset = i;.    op
79f0: 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
7a00: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
7a10: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f  ;.    if( op==WO
7a20: 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51  _IN ) op = WO_EQ
7a30: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
7a40: 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f  ].op = op;.    /
7a50: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
7a60: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
7a70: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
7a80: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
7a90: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
7aa0: 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
7ab0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
7ac0: 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
7ad0: 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
7ae0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
7af0: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
7b00: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73   fact. */.    as
7b10: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
7b20: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7b30: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61  AINT_EQ );.    a
7b40: 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
7b50: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7b60: 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
7b70: 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
7b80: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
7b90: 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
7ba0: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
7bb0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7bc0: 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
7bd0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
7be0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
7bf0: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
7c00: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
7c10: 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
7c20: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
7c30: 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CH );.    assert
7c40: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7c50: 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45  or & (WO_IN|WO_E
7c60: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
7c70: 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
7c80: 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
7c90: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
7ca0: 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
7cb0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
7cc0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7cd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
7ce0: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
7cf0: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
7d00: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
7d10: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
7d20: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
7d30: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
7d40: 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
7d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
7d60: 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
7d70: 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
7d80: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
7d90: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
7da0: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
7db0: 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
7dc0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
7dd0: 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
7de0: 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
7df0: 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
7e00: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
7e10: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
7e20: 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
7e30: 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
7e40: 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
7e50: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
7e60: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
7e70: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7e80: 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
7e90: 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
7ea0: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
7eb0: 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
7ec0: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
7ed0: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
7ee0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
7ef0: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
7f00: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
7f10: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7f20: 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
7f30: 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
7f40: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
7f50: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
7f60: 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
7f70: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
7f80: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
7f90: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
7fa0: 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
7fb0: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
7fc0: 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
7fd0: 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
7fe0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
7ff0: 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
8000: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8010: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
8020: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8030: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
8040: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
8050: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
8060: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
8070: 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
8080: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52  .  int rc;..  TR
8090: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
80a0: 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
80b0: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
80c0: 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
80d0: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
80e0: 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
80f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8100: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8110: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
8120: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
8130: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
8140: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
8150: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
8160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8170: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8180: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
8190: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
81a0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
81b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
81c0: 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
81d0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
81e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
81f0: 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
8200: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
8210: 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  Msg = 0;..  for(
8220: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
8230: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
8240: 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72   if( !p->aConstr
8250: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26  aint[i].usable &
8260: 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  & p->aConstraint
8270: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
8280: 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ex>0 ){.      sq
8290: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
82a0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
82b0: 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73   "table %s: xBes
82c0: 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  tIndex returned 
82d0: 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22  an invalid plan"
82e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
82f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8300: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
8310: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
8320: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8330: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
8340: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
8350: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8360: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
8370: 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61  stimate the loca
8380: 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63  tion of a partic
8390: 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61  ular key among a
83a0: 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a  ll keys in an.**
83b0: 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74   index.  Store t
83c0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53  he results in aS
83d0: 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  tat as follows:.
83e0: 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30  **.**    aStat[0
83f0: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
8400: 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20  er of rows less 
8410: 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20  than pRec.**    
8420: 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73  aStat[1]      Es
8430: 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
8440: 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a  s equal to pRec.
8450: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
8460: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61   index of the sa
8470: 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65  mple that is the
8480: 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   smallest sample
8490: 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61   that.** is grea
84a0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
84b0: 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20  l to pRec. Note 
84c0: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
84d0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a  is not an index.
84e0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d  ** into the aSam
84f0: 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74  ple[] array - it
8500: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74   is an index int
8510: 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20  o a virtual set 
8520: 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61  of samples.** ba
8530: 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
8540: 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d  nts of aSample[]
8550: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
8560: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63  of fields in rec
8570: 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a  ord .** pRec. .*
8580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
8590: 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
85a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
85b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
85c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
85d0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
85e0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
85f0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
8600: 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
8610: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
8620: 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
8630: 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
8640: 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
8650: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
8660: 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
8670: 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
8680: 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
8690: 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
86a0: 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86c0: 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
86d0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
86e0: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
86f0: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
8700: 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
8710: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8720: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8730: 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
8740: 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
8750: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
8780: 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63  t sample >= pRec
8790: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c   */.  int iSampl
87a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
87b0: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
87c0: 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
87d0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
87e0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20  c */.  int iMin 
87f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8800: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
8810: 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65  ample not yet te
8820: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  sted */.  int iT
8830: 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
8840: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61        /* Next sa
8850: 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  mple to test */.
8860: 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8880: 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   Result of compa
8890: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
88a0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
88d0: 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a  elds in pRec */.
88e0: 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
88f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
8900: 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d   anLt[] + anEq[]
8910: 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70   of largest samp
8920: 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a  le pRec is > */.
8930: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8940: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
8950: 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
8960: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
8970: 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
8980: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
8990: 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
89a0: 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
89b0: 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e  eld>0 && pRec->n
89c0: 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61  Field<=pIdx->nSa
89d0: 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a  mpleCol );..  /*
89e0: 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   Do a binary sea
89f0: 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  rch to find the 
8a00: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65  first sample gre
8a10: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
8a20: 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e  al.  ** to pRec.
8a30: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
8a40: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  s a single field
8a50: 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  , the set of sam
8a60: 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20  ples to search. 
8a70: 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68   ** is simply th
8a80: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
8a90: 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65  y. If the sample
8aa0: 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63  s in aSample[] c
8ab0: 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a  ontain more.  **
8ac0: 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73   than one fields
8ad0: 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c  , all fields fol
8ae0: 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74  lowing the first
8af0: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20   are ignored..  
8b00: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20  **.  ** If pRec 
8b10: 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64  contains N field
8b20: 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f  s, where N is mo
8b30: 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65  re than one, the
8b40: 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  n as well as the
8b50: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e  .  ** samples in
8b60: 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e   aSample[] (trun
8b70: 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64  cated to N field
8b80: 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61  s), the search a
8b90: 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  lso has to.  ** 
8ba0: 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65  consider prefixe
8bb0: 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c  s of those sampl
8bc0: 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  es. For example,
8bd0: 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73   if the set of s
8be0: 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61  amples.  ** in a
8bf0: 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a  Sample is:.  **.
8c00: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
8c10: 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20  [0] = (a, 5) .  
8c20: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31  **     aSample[1
8c30: 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a  ] = (a, 10) .  *
8c40: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d  *     aSample[2]
8c50: 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20   = (b, 5) .  ** 
8c60: 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d      aSample[3] =
8c70: 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
8c80: 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d      aSample[4] =
8c90: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
8ca0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61   ** Then the sea
8cb0: 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64  rch space should
8cc0: 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20   ideally be the 
8cd0: 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e  samples above an
8ce0: 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71  d the .  ** uniq
8cf0: 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c  ue prefixes [a],
8d00: 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75   [b] and [c]. Bu
8d10: 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20  t since that is 
8d20: 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65  hard to organize
8d30: 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  , .  ** the code
8d40: 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68   actually search
8d50: 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a  es this set:.  *
8d60: 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61  *.  **     0: (a
8d70: 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28  ) .  **     1: (
8d80: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
8d90: 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  2: (a, 10) .  **
8da0: 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20       3: (a, 10) 
8db0: 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29  .  **     4: (b)
8dc0: 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62   .  **     5: (b
8dd0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36  , 5) .  **     6
8de0: 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (c) .  **     
8df0: 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a  7: (c, 100) .  *
8e00: 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35  *     8: (c, 105
8e10: 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63  ).  **     9: (c
8e20: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
8e30: 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65   For each sample
8e40: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
8e50: 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c  ] array, N sampl
8e60: 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  es are present i
8e70: 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63  n the.  ** effec
8e80: 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61  tive sample arra
8e90: 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c  y. In the above,
8ea0: 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31   samples 0 and 1
8eb0: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20   are based on . 
8ec0: 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   ** sample aSamp
8ed0: 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32  le[0]. Samples 2
8ee0: 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c   and 3 on aSampl
8ef0: 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  e[1] etc..  **. 
8f00: 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c   ** Often, sampl
8f10: 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63  e i of each bloc
8f20: 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65  k of N effective
8f30: 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b   samples has (i+
8f40: 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20  1) fields..  ** 
8f50: 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d  Except, each sam
8f60: 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e  ple may be exten
8f70: 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ded to ensure th
8f80: 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72  at it is greater
8f90: 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71   than or.  ** eq
8fa0: 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69  ual to the previ
8fb0: 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ous sample in th
8fc0: 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61  e array. For exa
8fd0: 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f  mple, in the abo
8fe0: 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65  ve, .  ** sample
8ff0: 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20   2 is the first 
9000: 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63  sample of a bloc
9010: 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20  k of N samples, 
9020: 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a  so at first it .
9030: 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61    ** appears tha
9040: 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31  t it should be 1
9050: 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20   field in size. 
9060: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f  However, that wo
9070: 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a  uld make it .  *
9080: 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73  * smaller than s
9090: 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20  ample 1, so the 
90a0: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f  binary search wo
90b0: 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73  uld not work. As
90c0: 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a   a result, .  **
90d0: 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20   it is extended 
90e0: 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54  to two fields. T
90f0: 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68  he duplicates th
9100: 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20  at this creates 
9110: 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75  do not .  ** cau
9120: 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
9130: 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d  .  */.  nField =
9140: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20   pRec->nField;. 
9150: 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61   iCol = 0;.  iSa
9160: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61  mple = pIdx->nSa
9170: 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20  mple * nField;. 
9180: 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61   do{.    int iSa
9190: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
91a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
91b0: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20  in aSample[] of 
91c0: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20  test sample */. 
91d0: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
9200: 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d  elds in test sam
9210: 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73  ple */..    iTes
9220: 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c  t = (iMin+iSampl
9230: 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20  e)/2;.    iSamp 
9240: 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64  = iTest / nField
9250: 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e  ;.    if( iSamp>
9260: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
9270: 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63  e proposed effec
9280: 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61  tive sample is a
9290: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
92a0: 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e aSample[iSamp]
92b0: 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69  ..      ** Speci
92c0: 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f  fically, the sho
92d0: 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rtest prefix of 
92e0: 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54  at least (1 + iT
92f0: 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20  est%nField) .   
9300: 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61     ** fields tha
9310: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9320: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  n the previous e
9330: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e  ffective sample.
9340: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e    */.      for(n
9350: 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64  =(iTest % nField
9360: 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b  ) + 1; n<nField;
9370: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   n++){.        i
9380: 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  f( aSample[iSamp
9390: 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61  -1].anLt[n-1]!=a
93a0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
93b0: 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b  Lt[n-1] ) break;
93c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
93d0: 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54  se{.      n = iT
93e0: 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a  est + 1;.    }..
93f0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9400: 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20   = n;.    res = 
9410: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9420: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9430: 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70  [iSamp].n, aSamp
9440: 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65  le[iSamp].p, pRe
9450: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  c);.    if( res<
9460: 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
9470: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
9480: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61  p].anLt[n-1] + a
9490: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
94a0: 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Eq[n-1];.      i
94b0: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
94c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
94d0: 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20  ==0 && n<nField 
94e0: 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
94f0: 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
9500: 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anLt[n-1];.    
9510: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
9520: 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31  ;.      res = -1
9530: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9540: 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65     iSample = iTe
9550: 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d  st;.      iCol =
9560: 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77   n-1;.    }.  }w
9570: 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69  hile( res && iMi
9580: 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69  n<iSample );.  i
9590: 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69   = iSample / nFi
95a0: 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  eld;..#ifdef SQL
95b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
95c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
95d0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
95e0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
95f0: 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
9600: 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
9610: 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
9620: 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
9630: 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
9640: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
9650: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
9660: 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
9670: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
9680: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
9690: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
96a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28  ){.      /* If (
96b0: 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c  res==0) is true,
96c0: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
96d0: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70  be equal to samp
96e0: 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61  le i. */.      a
96f0: 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e  ssert( i<pIdx->n
9700: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20  Sample );.      
9710: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
9720: 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20  ield-1 );.      
9730: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9740: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73  Field;.      ass
9750: 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56  ert( 0==sqlite3V
9760: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
9770: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
9780: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
9790: 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  c) .           |
97a0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
97b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20  llocFailed .    
97c0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
97d0: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20        /* Unless 
97e0: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
97f0: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
9800: 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72  t pRec is larger
9810: 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61   than.      ** a
9820: 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
9830: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9840: 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  y, pRec must be 
9850: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
9860: 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b  .      ** (iCol+
9870: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
9880: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f  of sample i.  */
9890: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
98a0: 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  <=pIdx->nSample 
98b0: 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20  && i>=0 );.     
98c0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
98d0: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73  iCol+1;.      as
98e0: 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
98f0: 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
9900: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
9910: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
9920: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
9930: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
9940: 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  >0.           ||
9950: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9960: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
9970: 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61      /* if i==0 a
9980: 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  nd iCol==0, then
9990: 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   record pRec is 
99a0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c  smaller than all
99b0: 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a   samples.      *
99c0: 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  * in the aSample
99d0: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
99e0: 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29  ise, if (iCol>0)
99f0: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a   then pRec must.
9a00: 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61        ** be grea
9a10: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
9a20: 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20  l to the (iCol) 
9a30: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
9a40: 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20  sample i..      
9a50: 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65  ** If (i>0), the
9a60: 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f  n pRec must also
9a70: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
9a80: 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20   sample (i-1).  
9a90: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  */.      if( iCo
9aa0: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
9ab0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
9ac0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ol;.        asse
9ad0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
9ae0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
9af0: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
9b00: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d  le[i].p, pRec)<=
9b10: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
9b20: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
9b30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9b40: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9b50: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i>0 ){.        p
9b60: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
9b70: 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73  ield;.        as
9b80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
9b90: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
9ba0: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
9bb0: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
9bc0: 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
9bd0: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
9be0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9bf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9c00: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
9c10: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9c20: 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d  G */..  if( res=
9c30: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63  =0 ){.    /* Rec
9c40: 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61  ord pRec is equa
9c50: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f  l to sample i */
9c60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
9c70: 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20  l==nField-1 );. 
9c80: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
9c90: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
9ca0: 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  ol];.    aStat[1
9cb0: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
9cc0: 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c  nEq[iCol];.  }el
9cd0: 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  se{.    /* At th
9ce0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69  is point, the (i
9cf0: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
9d00: 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69  fix of aSample[i
9d10: 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a  ] is the first .
9d20: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68      ** sample th
9d30: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
9d40: 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20  an pRec. Or, if 
9d50: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9d60: 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a   then pRec.    *
9d70: 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
9d80: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
9d90: 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  the array. */.  
9da0: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
9db0: 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
9dc0: 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
9dd0: 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72   ){.      iUpper
9de0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
9df0: 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f  ToInt(pIdx->aiRo
9e00: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
9e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
9e20: 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  pper = aSample[i
9e30: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
9e40: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f    }..    if( iLo
9e50: 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
9e60: 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
9e70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e80: 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
9e90: 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
9ea0: 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
9eb0: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
9ec0: 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
9ed0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
9ee0: 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
9ef0: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
9f00: 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
9f10: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
9f20: 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b  x->aAvgEq[iCol];
9f30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
9f40: 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69  re the pRec->nFi
9f50: 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65  eld value before
9f60: 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a   returning.  */.
9f70: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9f80: 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72   nField;.  retur
9f90: 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n i;.}.#endif /*
9fa0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9fb0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
9fc0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ../*.** If it is
9fd0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d   not NULL, pTerm
9fe0: 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20   is a term that 
9ff0: 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65  provides an uppe
a000: 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f  r or lower.** bo
a010: 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73  und on a range s
a020: 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e  can. Without con
a030: 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20  sidering pTerm, 
a040: 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  it is estimated 
a050: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61  .** that the sca
a060: 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65  n will visit nNe
a070: 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  w rows. This fun
a080: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
a090: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69  e number.** esti
a0a0: 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  mated to be visi
a0b0: 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67  ted after taking
a0c0: 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f   pTerm into acco
a0d0: 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  unt..**.** If th
a0e0: 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c  e user explicitl
a0f0: 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69  y specified a li
a100: 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
a110: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a   for this term,.
a120: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  ** then the retu
a130: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
a140: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69  likelihood multi
a150: 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d  plied by the num
a160: 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20  ber of.** input 
a170: 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  rows. Otherwise,
a180: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
a190: 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22  ssumes that an "
a1a0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72  IS NOT NULL" ter
a1b0: 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c  m.** has a likel
a1c0: 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61  ihood of 0.50, a
a1d0: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72  nd any other ter
a1e0: 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  m a likelihood o
a1f0: 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69  f 0.25..*/.stati
a200: 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61  c LogEst whereRa
a210: 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54  ngeAdjust(WhereT
a220: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45  erm *pTerm, LogE
a230: 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45  st nNew){.  LogE
a240: 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a  st nRet = nNew;.
a250: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
a260: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
a270: 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
a280: 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72      nRet += pTer
a290: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
a2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
a2b0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
a2c0: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
a2d0: 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30        nRet -= 20
a2e0: 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
a2f0: 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
a300: 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20  st(4) );.    }. 
a310: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
a320: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
a330: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a340: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
a350: 52 65 74 75 72 6e 20 74 68 65 20 61 66 66 69 6e  Return the affin
a360: 69 74 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ity for a single
a370: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
a380: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  dex..*/.static c
a390: 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65 78  har sqlite3Index
a3a0: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 73  ColumnAffinity(s
a3b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
a3c0: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f  x *pIdx, int iCo
a3d0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
a3e0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49  ol>=0 && iCol<pI
a3f0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
a400: 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c   if( !pIdx->zCol
a410: 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Aff ){.    if( s
a420: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
a430: 69 74 79 53 74 72 28 64 62 2c 20 70 49 64 78 29  ityStr(db, pIdx)
a440: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
a450: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
a460: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d  }.  return pIdx-
a470: 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a  >zColAff[iCol];.
a480: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
a490: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a4a0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
a4b0: 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
a4c0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
a4d0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
a4e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
a4f0: 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e  ited by a.** ran
a500: 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69  ge-scan on a ski
a510: 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f  p-scan index. Fo
a520: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
a530: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
a540: 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63  i1 ON t1(a, b, c
a550: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  );.**   SELECT *
a560: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
a570: 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e  =? AND c BETWEEN
a580: 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20   ? AND ?;.**.** 
a590: 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Value pLoop->nOu
a5a0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
a5b0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
a5c0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
a5d0: 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66  ws .** visited f
a5e0: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f  or scanning (a=?
a5f0: 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20   AND b=?). This 
a600: 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73  function reduces
a610: 20 74 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a   that estimate .
a620: 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f  ** by some facto
a630: 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  r to account for
a640: 20 74 68 65 20 28 63 20 42 45 54 57 45 45 4e 20   the (c BETWEEN 
a650: 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73  ? AND ?) express
a660: 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20  ion based.** on 
a670: 74 68 65 20 73 74 61 74 34 20 64 61 74 61 20 66  the stat4 data f
a680: 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68  or the index. th
a690: 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20  is scan will be 
a6a0: 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c  peformed multipl
a6b0: 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63  e .** times (onc
a6c0: 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29  e for each (a,b)
a6d0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61   combination tha
a6e0: 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69  t matches a=?) i
a6f0: 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a  s dealt with .**
a700: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
a710: 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68  **.** It does th
a720: 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74  is by scanning t
a730: 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34  hrough all stat4
a740: 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72   samples, compar
a750: 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78  ing values.** ex
a760: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
a770: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 77  wer and pUpper w
a780: 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ith the correspo
a790: 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  nding column in 
a7a0: 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20  each.** sample. 
a7b0: 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74  If L and U are t
a7c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  he number of sam
a7d0: 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65  ples found to be
a7e0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a   less than or.**
a7f0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61   equal to the va
a800: 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66  lues extracted f
a810: 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  rom pLower and p
a820: 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
a830: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20  ly, and.** N is 
a840: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
a850: 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65   of samples, the
a860: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c   pLoop->nOut val
a870: 75 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ue is adjusted.*
a880: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
a890: 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75  .**   nOut = nOu
a8a0: 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c  t * ( min(U - L,
a8b0: 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20   1) / N ).**.** 
a8c0: 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  If pLower is NUL
a8d0: 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
a8e0: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
a8f0: 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c  d from the term,
a900: 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20   L is.** set to 
a910: 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20  zero. If pUpper 
a920: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61  is NULL, or a va
a930: 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78  lue cannot be ex
a940: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c  tracted from it,
a950: 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20  .** U is set to 
a960: 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  N..**.** Normall
a970: 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
a980: 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f   sets *pbDone to
a990: 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e   1 before return
a9a0: 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  ing. However,.**
a9b0: 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e   if no value can
a9c0: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
a9d0: 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72  om either pLower
a9e0: 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64 20   or pUpper (and 
a9f0: 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61  so the.** estima
aa00: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
aa10: 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72   of rows deliver
aa20: 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ed remains uncha
aa30: 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a  nged), *pbDone.*
aa40: 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e  * is left as is.
aa50: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
aa60: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
aa70: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
aa80: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
aa90: 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49  erwise, .** SQLI
aaa0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
aab0: 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
aac0: 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61  kipScanEst(.  Pa
aad0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
aae0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
aaf0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
ab00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
ab10: 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
ab20: 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
ab30: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
ab40: 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
ab50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
ab60: 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
ab70: 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
ab80: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
ab90: 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
aba0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
abb0: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
abc0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
abd0: 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66  e .nOut value of
abe0: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
abf0: 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20  int *pbDone     
ac00: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
ac10: 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 20  rue if at least 
ac20: 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20  one expr. value 
ac30: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a  extracted */.){.
ac40: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
ac50: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
ac60: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
ac70: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
ac80: 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Eq;.  sqlite3 *d
ac90: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
aca0: 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d    int nLower = -
acb0: 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20  1;.  int nUpper 
acc0: 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a  = p->nSample+1;.
acd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ace0: 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d  E_OK;.  u8 aff =
acf0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
ad00: 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c 20  umnAffinity(db, 
ad10: 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53  p, nEq);.  CollS
ad20: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20  eq *pColl;.  .  
ad30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
ad40: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
ad50: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
ad60: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a  ed from pLower *
ad70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
ad80: 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20  e *p2 = 0;      
ad90: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
ada0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70  racted from pUpp
adb0: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
adc0: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
add0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
ade0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
adf0: 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f  record */..  pCo
ae00: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
ae10: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
ae20: 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d  , p->azColl[nEq]
ae30: 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  );.  if( pLower 
ae40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
ae50: 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
ae60: 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c  mExpr(pParse, pL
ae70: 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
ae80: 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a  ght, aff, &p1);.
ae90: 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a      nLower = 0;.
aea0: 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72    }.  if( pUpper
aeb0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
aec0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
aed0: 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46  lite3Stat4ValueF
aee0: 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
aef0: 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
af00: 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29  Right, aff, &p2)
af10: 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70  ;.    nUpper = p
af20: 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70  2 ? 0 : p->nSamp
af30: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  le;.  }..  if( p
af40: 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69  1 || p2 ){.    i
af50: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44  nt i;.    int nD
af60: 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  iff;.    for(i=0
af70: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
af80: 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b  && i<p->nSample;
af90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
afa0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f  = sqlite3Stat4Co
afb0: 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d  lumn(db, p->aSam
afc0: 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61  ple[i].p, p->aSa
afd0: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20  mple[i].n, nEq, 
afe0: 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  &pVal);.      if
aff0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b000: 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20  && p1 ){.       
b010: 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74   int res = sqlit
b020: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c  e3MemCompare(p1,
b030: 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20   pVal, pColl);. 
b040: 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d         if( res>=
b050: 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20  0 ) nLower++;.  
b060: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b070: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b080: 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p2 ){.        i
b090: 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
b0a0: 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70  MemCompare(p2, p
b0b0: 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
b0c0: 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
b0d0: 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20  ) nUpper++;.    
b0e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44    }.    }.    nD
b0f0: 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20  iff = (nUpper - 
b100: 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28  nLower);.    if(
b110: 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66   nDiff<=0 ) nDif
b120: 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49  f = 1;..    /* I
b130: 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
b140: 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  an upper and low
b150: 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69  er bound specifi
b160: 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20  ed, and the .   
b170: 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   ** comparisons 
b180: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
b190: 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67  ey are close tog
b1a0: 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66  ether, use the f
b1b0: 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d  allback.    ** m
b1c0: 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68  ethod (assume th
b1d0: 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69  at the scan visi
b1e0: 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72  ts 1/64 of the r
b1f0: 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74  ows) for estimat
b200: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  ing.    ** the n
b210: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
b220: 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65  sited. Otherwise
b230: 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  , estimate the n
b240: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
b250: 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d    ** using the m
b260: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
b270: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  in the header co
b280: 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66  mment for this f
b290: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
b2a0: 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20  if( nDiff!=1 || 
b2b0: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f  pUpper==0 || pLo
b2c0: 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wer==0 ){.      
b2d0: 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73  int nAdjust = (s
b2e0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e  qlite3LogEst(p->
b2f0: 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74  nSample) - sqlit
b300: 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29  e3LogEst(nDiff))
b310: 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  ;.      pLoop->n
b320: 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a  Out -= nAdjust;.
b330: 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20        *pbDone = 
b340: 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  1;.      WHERETR
b350: 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67  ACE(0x10, ("rang
b360: 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69  e skip-scan regi
b370: 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a  ons: %u..%u  adj
b380: 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22  ust=%d est=%d\n"
b390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
b3b0: 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64  wer, nUpper, nAd
b3c0: 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e  just*-1, pLoop->
b3d0: 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  nOut));.    }.. 
b3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
b3f0: 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29  rt( *pbDone==0 )
b400: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
b410: 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20  ValueFree(p1);. 
b420: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
b430: 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p2);.  sqlite3
b440: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
b450: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
b460: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b470: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
b480: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
b490: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b4a0: 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
b4b0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
b4c0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
b4d0: 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
b4e0: 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
b4f0: 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
b500: 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
b510: 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
b520: 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
b530: 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
b540: 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
b550: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
b560: 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
b570: 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
b580: 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
b590: 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
b5a0: 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
b5b0: 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
b5c0: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
b5d0: 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
b5e0: 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
b5f0: 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
b600: 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
b610: 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
b640: 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
b660: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b680: 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
b690: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
b6a0: 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
b6b0: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
b6c0: 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
b6d0: 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
b6e0: 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
b6f0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
b700: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
b710: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28  * The value in (
b720: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
b730: 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20  u.btree.nEq) is 
b740: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
b750: 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
b760: 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
b770: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
b780: 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
b790: 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
b7a0: 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
b7b0: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
b7c0: 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
b7d0: 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
b7e0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
b7f0: 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
b800: 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
b810: 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
b820: 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
b830: 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
b840: 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
b850: 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
b860: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
b870: 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
b880: 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
b890: 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
b8a0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
b8b0: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
b8c0: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
b8d0: 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
b8e0: 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
b8f0: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
b900: 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
b910: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
b920: 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
b930: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
b940: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
b950: 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
b960: 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
b970: 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
b980: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
b990: 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
b9a0: 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
b9b0: 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
b9c0: 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
b9d0: 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
b9e0: 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
b9f0: 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f   is 0, then *pnO
ba00: 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ut is the number
ba10: 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20   of .** rows in 
ba20: 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d  the index. Assum
ba30: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
ba40: 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61  urs, *pnOut is a
ba50: 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64  djusted (reduced
ba60: 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20  ).** to account 
ba70: 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f  for the range co
ba80: 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72  nstraints pLower
ba90: 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20   and pUpper..** 
baa0: 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e  .** In the absen
bab0: 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ce of sqlite_sta
bac0: 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t4 ANALYZE data,
bad0: 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61   or if such data
bae0: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73   cannot be.** us
baf0: 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e  ed, a single ran
bb00: 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65  ge inequality re
bb10: 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
bb20: 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
bb30: 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64  or of 4. .** and
bb40: 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74   a pair of const
bb50: 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20  raints (x>? AND 
bb60: 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65  x<?) reduces the
bb70: 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   expected number
bb80: 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69   of.** rows visi
bb90: 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20  ted by a factor 
bba0: 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63  of 64..*/.static
bbb0: 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
bbc0: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
bbd0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
bbe0: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
bbf0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
bc00: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
bc10: 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
bc20: 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d  der,.  WhereTerm
bc30: 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
bc40: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
bc50: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
bc60: 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
bc70: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
bc80: 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
bc90: 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
bca0: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
bcb0: 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
bcc0: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
bcd0: 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a  op *pLoop     /*
bce0: 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75   Modify the .nOu
bcf0: 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75  t and maybe .rRu
bd00: 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20  n fields */.){. 
bd10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bd20: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  _OK;.  int nOut 
bd30: 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20  = pLoop->nOut;. 
bd40: 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23   LogEst nNew;..#
bd50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bd60: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
bd70: 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  T4.  Index *p = 
bd80: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
bd90: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
bda0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
bdb0: 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d  e.nEq;..  if( p-
bdc0: 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45  >nSample>0 && nE
bdd0: 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  q<p->nSampleCol 
bde0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  ){.    if( nEq==
bdf0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
be00: 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70  lid ){.      Unp
be10: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
be20: 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
be30: 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e  ec;.      tRowcn
be40: 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38  t a[2];.      u8
be50: 20 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   aff;..      /* 
be60: 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20  Variable iLower 
be70: 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
be80: 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
be90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
bea0: 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  s in .      ** t
beb0: 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
bec0: 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  e less than the 
bed0: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
bee0: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
bef0: 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77  The.      ** low
bf00: 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74  er bound being t
bf10: 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
bf20: 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77   of $P and $L, w
bf30: 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20  here $P is the. 
bf40: 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66       ** key-pref
bf50: 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65  ix formed by the
bf60: 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63   nEq values matc
bf70: 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  hed against the 
bf80: 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20  nEq left-most.  
bf90: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f      ** columns o
bfa0: 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
bfb0: 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65   $L is the value
bfc0: 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20   in pLower..    
bfd0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72    **.      ** Or
bfe0: 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e  , if pLower is N
bff0: 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74  ULL or $L cannot
c000: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
c010: 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20 69  om it (because i
c020: 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f  t.      ** is no
c030: 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61  t a simple varia
c040: 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76  ble or literal v
c050: 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72  alue), the lower
c060: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20   bound of the.  
c070: 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20      ** range is 
c080: 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69  $P. Due to a qui
c090: 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68  rk in the way wh
c0a0: 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f  ereKeyStats() wo
c0b0: 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  rks, even.      
c0c0: 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69  ** if $L is avai
c0d0: 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53  lable, whereKeyS
c0e0: 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64  tats() is called
c0f0: 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61   for both ($P) a
c100: 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50  nd .      ** ($P
c110: 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72  :$L) and the lar
c120: 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72  ger of the two r
c130: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69  eturned values i
c140: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a  s used..      **
c150: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61  .      ** Simila
c160: 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20 74  rly, iUpper is t
c170: 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  o be set to the 
c180: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
c190: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
c1a0: 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61       ** less tha
c1b0: 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  n the upper boun
c1c0: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
c1d0: 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65 20  uery. Where the 
c1e0: 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20  upper bound.    
c1f0: 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28    ** is either (
c200: 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20  $P) or ($P:$U). 
c210: 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24  Again, even if $
c220: 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  U is available, 
c230: 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20  both values.    
c240: 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61    ** of iUpper a
c250: 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20  re requested of 
c260: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
c270: 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  and the smaller 
c280: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
c290: 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62       ** The numb
c2a0: 65 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65  er of rows betwe
c2b0: 65 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64  en the two bound
c2c0: 73 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69  s is then just i
c2d0: 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20  Upper-iLower..  
c2e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f      */.      tRo
c2f0: 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20  wcnt iLower;    
c300: 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68   /* Rows less th
c310: 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  an the lower bou
c320: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77  nd */.      tRow
c330: 63 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20 20  cnt iUpper;     
c340: 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61  /* Rows less tha
c350: 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  n the upper boun
c360: 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  d */.      int i
c370: 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f  LwrIdx = -2;   /
c380: 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20  * aSample[] for 
c390: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c3a0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70  */.      int iUp
c3b0: 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  rIdx = -1;   /* 
c3c0: 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68  aSample[] for th
c3d0: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f  e upper bound */
c3e0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 63  ..      if( pRec
c3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
c400: 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65  case( pRec->nFie
c410: 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ld!=pBuilder->nR
c420: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  ecValid );.     
c430: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
c440: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
c450: 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20  Valid;.      }. 
c460: 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
c470: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
c480: 69 6e 69 74 79 28 70 50 61 72 73 65 2d 3e 64 62  inity(pParse->db
c490: 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 20 20 20  , p, nEq);.     
c4a0: 20 61 73 73 65 72 74 28 20 6e 45 71 21 3d 70 2d   assert( nEq!=p-
c4b0: 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 61 66 66 3d  >nKeyCol || aff=
c4c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
c4d0: 47 45 52 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  GER );.      /* 
c4e0: 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72  Determine iLower
c4f0: 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e   and iUpper usin
c500: 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a  g ($P) only. */.
c510: 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30        if( nEq==0
c520: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
c530: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
c540: 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77  iUpper = p->nRow
c550: 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Est0;.      }els
c560: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  e{.        /* No
c570: 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f  te: this call co
c580: 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  uld be optimized
c590: 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68   away - since th
c5a0: 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75  e same values mu
c5b0: 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  st .        ** h
c5c0: 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
c5d0: 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20  ed when testing 
c5e0: 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45  key $P in whereE
c5f0: 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20  qualScanEst().  
c600: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  */.        where
c610: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
c620: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
c630: 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20  .        iLower 
c640: 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
c650: 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20  iUpper = a[0] + 
c660: 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  a[1];.      }.. 
c670: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
c680: 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65  wer==0 || (pLowe
c690: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
c6a0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
c6b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c6c0: 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28  ( pUpper==0 || (
c6d0: 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
c6e0: 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
c6f0: 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))!=0 );.      a
c700: 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f  ssert( p->aSortO
c710: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
c720: 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64   if( p->aSortOrd
c730: 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20  er[nEq] ){.     
c740: 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20     /* The roles 
c750: 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  of pLower and pU
c760: 70 70 65 72 20 61 72 65 20 73 77 61 70 70 65 64  pper are swapped
c770: 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65   for a DESC inde
c780: 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41  x */.        SWA
c790: 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c  P(WhereTerm*, pL
c7a0: 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20  ower, pUpper);. 
c7b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
c7c0: 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
c7d0: 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f  prove on the iLo
c7e0: 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  wer estimate usi
c7f0: 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20  ng ($P:$L). */. 
c800: 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20       if( pLower 
c810: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
c820: 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Ok;             
c830: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
c840: 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61  f value is extra
c850: 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
c860: 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
c870: 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
c880: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
c890: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c8a0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
c8b0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
c8c0: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
c8d0: 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b  aff, nEq, &bOk);
c8e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
c8f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
c900: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  k ){.          t
c910: 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
c920: 20 20 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d         iLwrIdx =
c930: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
c940: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
c950: 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  0, a);.         
c960: 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
c970: 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
c980: 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c  or & (WO_GT|WO_L
c990: 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  E)) ? a[1] : 0);
c9a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c9b0: 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f  New>iLower ) iLo
c9c0: 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  wer = iNew;.    
c9d0: 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
c9e0: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d          pLower =
c9f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
ca00: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
ca10: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
ca20: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70  rove on the iUpp
ca30: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
ca40: 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20  g ($P:$U). */.  
ca50: 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
ca60: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f  {.        int bO
ca70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
ca80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ca90: 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
caa0: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
cab0: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
cac0: 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
cad0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
cae0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
caf0: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
cb00: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
cb10: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
cb20: 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a  ff, nEq, &bOk);.
cb30: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
cb40: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
cb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
cb60: 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
cb70: 20 20 20 20 20 20 69 55 70 72 49 64 78 20 3d 20        iUprIdx = 
cb80: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
cb90: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31  arse, p, pRec, 1
cba0: 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
cbb0: 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
cbc0: 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
cbd0: 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45  r & (WO_GT|WO_LE
cbe0: 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  )) ? a[1] : 0);.
cbf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
cc00: 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
cc10: 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
cc20: 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
cc30: 20 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20         pUpper = 
cc40: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
cc50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69     }..      pBui
cc60: 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
cc70: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  c;.      if( rc=
cc80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cc90: 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
cca0: 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20  >iLower ){.     
ccb0: 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69       nNew = sqli
ccc0: 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72  te3LogEst(iUpper
ccd0: 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - iLower);.    
cce0: 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
ccf0: 20 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72    If both iUpper
cd00: 20 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20   and iLower are 
cd10: 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65  derived from the
cd20: 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
cd30: 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ** sample, then 
cd40: 61 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20  assume they are 
cd50: 34 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  4x more selectiv
cd60: 65 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a  e.  This brings.
cd70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
cd80: 20 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63   estimated selec
cd90: 74 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c  tivity more in l
cda0: 69 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74  ine with what it
cdb0: 20 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20   would be.      
cdc0: 20 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61      ** if estima
cdd0: 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  ted without the 
cde0: 75 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74  use of STAT3/4 t
cdf0: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ables. */.      
ce00: 20 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d      if( iLwrIdx=
ce10: 3d 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20  =iUprIdx ) nNew 
ce20: 2d 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20  -= 20;  assert( 
ce30: 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
ce40: 74 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(4) );.        
ce50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ce60: 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20   nNew = 10;     
ce70: 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73     assert( 10==s
ce80: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
ce90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cea0: 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
ceb0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
cec0: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  nOut = nNew;.   
ced0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57       }.        W
cee0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20  HERETRACE(0x10, 
cef0: 28 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63  ("STAT4 range sc
cf00: 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d  an: %u..%u  est=
cf10: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28    (u32)iLower, (
cf40: 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74  u32)iUpper, nOut
cf50: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
cf60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
cf70: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20   bDone = 0;.    
cf80: 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
cf90: 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61  eSkipScanEst(pPa
cfa0: 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rse, pLower, pUp
cfb0: 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f  per, pLoop, &bDo
cfc0: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ne);.      if( b
cfd0: 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63  Done ) return rc
cfe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
cff0: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
d000: 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
d010: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d020: 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73  (pBuilder);.  as
d030: 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
d040: 70 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66  pUpper );.#endif
d050: 0a 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65  .  assert( pUppe
d060: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
d070: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
d080: 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e  VNULL)==0 );.  n
d090: 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65  New = whereRange
d0a0: 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e  Adjust(pLower, n
d0b0: 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  Out);.  nNew = w
d0c0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
d0d0: 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a  pUpper, nNew);..
d0e0: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
d0f0: 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
d100: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
d110: 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68   limit and neith
d120: 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61  er limit.  ** ha
d130: 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  s an application
d140: 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68  -defined likelih
d150: 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68  ood(), assume th
d160: 65 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20  e range is.  ** 
d170: 72 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64  reduced by an ad
d180: 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68  ditional 75%. Th
d190: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62  is means that, b
d1a0: 79 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70  y default, an op
d1b0: 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61  en-ended.  ** ra
d1c0: 6e 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20  nge query (e.g. 
d1d0: 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75  col > ?) is assu
d1e0: 6d 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34  med to match 1/4
d1f0: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20   of the rows in 
d200: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20  the.  ** index. 
d210: 57 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72  While a closed r
d220: 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42  ange (e.g. col B
d230: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20  ETWEEN ? AND ?) 
d240: 69 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a  is estimated to.
d250: 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20    ** match 1/64 
d260: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f  of the index. */
d270: 20 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26   .  if( pLower &
d280: 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50  & pLower->truthP
d290: 72 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20  rob>0 && pUpper 
d2a0: 26 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68  && pUpper->truth
d2b0: 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e  Prob>0 ){.    nN
d2c0: 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20  ew -= 20;.  }.. 
d2d0: 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
d2e0: 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
d2f0: 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
d300: 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
d310: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
d320: 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69   nOut = nNew;.#i
d330: 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
d340: 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20  RACE_ENABLED).  
d350: 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e  if( pLoop->nOut>
d360: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52  nOut ){.    WHER
d370: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61  ETRACE(0x10,("Ra
d380: 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20  nge scan lowers 
d390: 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20  nOut from %d to 
d3a0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
d3b0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
d3c0: 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a  ->nOut, nOut));.
d3d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f    }.#endif.  pLo
d3e0: 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
d3f0: 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72  st)nOut;.  retur
d400: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
d410: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
d420: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
d430: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d440: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
d450: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
d460: 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
d470: 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
d480: 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
d490: 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
d4a0: 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
d4b0: 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
d4c0: 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
d4d0: 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
d4e0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
d4f0: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
d500: 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
d510: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
d520: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
d530: 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
d540: 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
d550: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
d560: 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
d570: 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
d580: 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
d590: 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
d5a0: 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
d5b0: 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
d5c0: 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
d5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
d5e0: 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
d5f0: 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
d600: 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
d610: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
d620: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
d630: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d640: 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
d650: 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
d660: 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
d670: 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
d680: 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
d690: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
d6a0: 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
d6b0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
d6c0: 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
d6d0: 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
d6e0: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
d6f0: 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
d700: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
d710: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
d720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
d730: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
d740: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d750: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d760: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
d770: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d780: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
d790: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
d7a0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
d7b0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d7c0: 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
d7d0: 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
d7e0: 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63  raint */.  tRowc
d7f0: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
d800: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
d810: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
d820: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
d830: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
d840: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
d850: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
d860: 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nEq = pBuilder->
d870: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
d880: 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  q;.  UnpackedRec
d890: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
d8a0: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38  lder->pRec;.  u8
d8b0: 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20   aff;           
d8c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
d8d0: 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20  n affinity */.  
d8e0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
d8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
d900: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
d910: 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
d920: 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  t a[2];         
d930: 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63      /* Statistic
d940: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a  s */.  int bOk;.
d950: 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d  .  assert( nEq>=
d960: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  1 );.  assert( n
d970: 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Eq<=p->nColumn )
d980: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
d990: 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61  Sample!=0 );.  a
d9a0: 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c  ssert( p->nSampl
d9b0: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
d9c0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
d9d0: 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f  alid<nEq );..  /
d9e0: 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72 65 20  * If values are 
d9f0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
da00: 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  r all fields of 
da10: 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65  the index to the
da20: 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68   left.  ** of th
da30: 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d  is one, no estim
da40: 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e  ate can be made.
da50: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   Return SQLITE_N
da60: 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66  OTFOUND. */.  if
da70: 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
da80: 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b  Valid<(nEq-1) ){
da90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
daa0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d  TE_NOTFOUND;.  }
dab0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ..  /* This is a
dac0: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  n optimization o
dad0: 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f  nly. The call to
dae0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
daf0: 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a  beSetValue().  *
db00: 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65  * below would re
db10: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61  turn the same va
db20: 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e  lue.  */.  if( n
db30: 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Eq>=p->nColumn )
db40: 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31  {.    *pnRow = 1
db50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
db60: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
db70: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
db80: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
db90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e  pParse->db, p, n
dba0: 45 71 2d 31 29 3b 0a 20 20 72 63 20 3d 20 73 71  Eq-1);.  rc = sq
dbb0: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
dbc0: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
dbd0: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
dbe0: 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f   aff, nEq-1, &bO
dbf0: 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
dc00: 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
dc10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dc20: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dc30: 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
dc40: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
dc50: 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
dc60: 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
dc70: 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
dc80: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
dc90: 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
dca0: 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
dcb0: 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
dcc0: 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
dcd0: 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
dce0: 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
dcf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
dd00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
dd10: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
dd20: 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
dd30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
dd40: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
dd50: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
dd60: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
dd70: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
dd80: 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
dd90: 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
dda0: 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
ddb0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
ddc0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
ddd0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
dde0: 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
ddf0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
de00: 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
de10: 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
de20: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
de30: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
de40: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
de50: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
de60: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
de70: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
de80: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
de90: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
dea0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
deb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
dec0: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
ded0: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
dee0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
def0: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
df00: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
df10: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
df20: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
df30: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
df40: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
df50: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
df60: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
df70: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
df80: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
df90: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
dfa0: 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
dfb0: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
dfc0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
dfd0: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
dfe0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
dff0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
e000: 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
e010: 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
e020: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
e030: 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
e040: 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
e050: 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
e060: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
e070: 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
e080: 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
e090: 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
e0a0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
e0b0: 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
e0c0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
e0d0: 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20  ex;.  i64 nRow0 
e0e0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
e0f0: 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67  oInt(p->aiRowLog
e100: 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  Est[0]);.  int n
e110: 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
e120: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
e130: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e140: 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62  E_OK;     /* Sub
e150: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
e160: 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
e170: 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  t nEst;         
e180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
e190: 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ows for a single
e1a0: 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63   term */.  tRowc
e1b0: 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20  nt nRowEst = 0; 
e1c0: 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61     /* New estima
e1d0: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
e1e0: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
e1f0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e200: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e210: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
e220: 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
e230: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
e240: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e250: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
e260: 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20   i++){.    nEst 
e270: 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20  = nRow0;.    rc 
e280: 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
e290: 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
e2a0: 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  lder, pList->a[i
e2b0: 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
e2c0: 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
e2d0: 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64  nEst;.    pBuild
e2e0: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
e2f0: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a  nRecValid;.  }..
e300: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
e320: 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29  RowEst > nRow0 )
e330: 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30   nRowEst = nRow0
e340: 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
e350: 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
e360: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e  ETRACE(0x10,("IN
e370: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
e380: 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%d\n", nRowEs
e390: 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  t));.  }.  asser
e3a0: 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
e3b0: 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69  cValid==nRecVali
e3c0: 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d );.  return rc
e3d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
e3e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
e3f0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a  3_OR_STAT4 */...
e400: 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
e410: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
e420: 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  Print the conten
e430: 74 20 6f 66 20 61 20 57 68 65 72 65 54 65 72 6d  t of a WhereTerm
e440: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
e450: 63 20 76 6f 69 64 20 77 68 65 72 65 54 65 72 6d  c void whereTerm
e460: 50 72 69 6e 74 28 57 68 65 72 65 54 65 72 6d 20  Print(WhereTerm 
e470: 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54 65 72  *pTerm, int iTer
e480: 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d  m){.  if( pTerm=
e490: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
e4a0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 54 45  3DebugPrintf("TE
e4b0: 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c  RM-%-3d NULL\n",
e4c0: 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   iTerm);.  }else
e4d0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79 70 65  {.    char zType
e4e0: 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [4];.    memcpy(
e4f0: 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29  zType, "...", 4)
e500: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
e510: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
e520: 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b  VIRTUAL ) zType[
e530: 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66  0] = 'V';.    if
e540: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
e550: 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29  or & WO_EQUIV  )
e560: 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b   zType[1] = 'E';
e570: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
e580: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
e590: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
e5a0: 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d  in) ) zType[2] =
e5b0: 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   'L';.    sqlite
e5c0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
e5d0: 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20       "TERM-%-3d 
e5e0: 25 70 20 25 73 20 63 75 72 73 6f 72 3d 25 2d 33  %p %s cursor=%-3
e5f0: 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30  d prob=%-3d op=0
e600: 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78  x%03x wtFlags=0x
e610: 25 30 34 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %04x\n",.       
e620: 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54  iTerm, pTerm, zT
e630: 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74  ype, pTerm->left
e640: 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 74  Cursor, pTerm->t
e650: 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20  ruthProb,.      
e660: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e670: 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  r, pTerm->wtFlag
e680: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
e690: 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70  reeViewExpr(0, p
e6a0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Term->pExpr, 0);
e6b0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
e6c0: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
e6d0: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
e6e0: 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70  rint a WhereLoop
e6f0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75   object for debu
e700: 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  gging purposes.*
e710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
e720: 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65  ereLoopPrint(Whe
e730: 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
e740: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
e750: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
e760: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
e770: 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
e780: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
e790: 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74  >nSrc+7)/8;.  st
e7a0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
e7b0: 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  m *pItem = pWInf
e7c0: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
e7d0: 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
e7e0: 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
e7f0: 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
e800: 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25  DebugPrintf("%c%
e810: 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78  2d.%0*llx.%0*llx
e820: 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20  ", p->cId,.     
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e  p->iTab, nb, p->
e850: 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d  maskSelf, nb, p-
e860: 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69  >prereq);.  sqli
e870: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e880: 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
e8a0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
e8b0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
e8c0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
e8d0: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
e8e0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
e8f0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  E)==0 ){.    con
e900: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
e910: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72      if( p->u.btr
e920: 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e  ee.pIndex && (zN
e930: 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
e940: 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21  .pIndex->zName)!
e950: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
e960: 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  strncmp(zName, "
e970: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
e980: 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  _", 17)==0 ){.  
e990: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71        int i = sq
e9a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
e9b0: 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  ame) - 1;.      
e9c0: 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69    while( zName[i
e9d0: 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20  ]!='_' ) i--;.  
e9e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69        zName += i
e9f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ea00: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
ea10: 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c  tf(".%-16s %2d",
ea20: 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72   zName, p->u.btr
ea30: 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c  ee.nEq);.    }el
ea40: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
ea50: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32  3DebugPrintf("%2
ea60: 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20  0s","");.    }. 
ea70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
ea80: 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   *z;.    if( p->
ea90: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b  u.vtab.idxStr ){
eaa0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
eab0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
eac0: 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20  \"%s\",%x)",.   
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
eae0: 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
eaf0: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
eb00: 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
eb10: 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ask);.    }else{
eb20: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
eb30: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
eb40: 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  %x)", p->u.vtab.
eb50: 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
eb60: 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
eb70: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
eb80: 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39  bugPrintf(" %-19
eb90: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  s", z);.    sqli
eba0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
ebb0: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
ebc0: 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
ebd0: 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  AN ){.    sqlite
ebe0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66  3DebugPrintf(" f
ebf0: 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d   %05x %d-%d", p-
ec00: 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
ec10: 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20  erm,p->nSkip);. 
ec20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
ec30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
ec40: 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70   f %05x N %d", p
ec50: 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
ec60: 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Term);.  }.  sql
ec70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ec80: 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c  " cost %d,%d,%d\
ec90: 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70  n", p->rSetup, p
eca0: 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29  ->rRun, p->nOut)
ecb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72  ;.  if( p->nLTer
ecc0: 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65  m && (sqlite3Whe
ecd0: 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29  reTrace & 0x100)
ece0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
ecf0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ed00: 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29  <p->nLTerm; i++)
ed10: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72  {.      whereTer
ed20: 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d  mPrint(p->aLTerm
ed30: 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
ed40: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
ed50: 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20  ** Convert bulk 
ed60: 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61  memory into a va
ed70: 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  lid WhereLoop th
ed80: 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  at can be passed
ed90: 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70  .** to whereLoop
eda0: 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79  Clear harmlessly
edb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
edc0: 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57   whereLoopInit(W
edd0: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
ede0: 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61  p->aLTerm = p->a
edf0: 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d  LTermSpace;.  p-
ee00: 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
ee10: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79  ->nLSlot = Array
ee20: 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70  Size(p->aLTermSp
ee30: 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61  ace);.  p->wsFla
ee40: 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gs = 0;.}../*.**
ee50: 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65   Clear the Where
ee60: 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c  Loop.u union.  L
ee70: 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70  eave WhereLoop.p
ee80: 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f  LTerm intact..*/
ee90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
eea0: 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
eeb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
eec0: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
eed0: 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
eee0: 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  (WHERE_VIRTUALTA
eef0: 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  BLE|WHERE_AUTO_I
ef00: 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28  NDEX) ){.    if(
ef10: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
ef20: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
ef30: 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74  E)!=0 && p->u.vt
ef40: 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
ef50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ef60: 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  e(p->u.vtab.idxS
ef70: 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  tr);.      p->u.
ef80: 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
ef90: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  0;.      p->u.vt
efa0: 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
efb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
efc0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
efd0: 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
efe0: 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
eff0: 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
f000: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f010: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
f020: 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
f030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
f040: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
f050: 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee.pIndex);.    
f060: 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
f070: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
f080: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c   }.}../*.** Deal
f090: 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20  locate internal 
f0a0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
f0b0: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
f0c0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
f0d0: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
f0e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
f0f0: 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
f100: 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e  ( p->aLTerm!=p->
f110: 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71  aLTermSpace ) sq
f120: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f130: 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68  p->aLTerm);.  wh
f140: 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
f150: 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72  n(db, p);.  wher
f160: 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a  eLoopInit(p);.}.
f170: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20  ./*.** Increase 
f180: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
f190: 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d  ation for pLoop-
f1a0: 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20  >aLTerm[] to be 
f1b0: 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73  at least n..*/.s
f1c0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
f1d0: 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65  oopResize(sqlite
f1e0: 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
f1f0: 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57   *p, int n){.  W
f200: 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77  hereTerm **paNew
f210: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f  ;.  if( p->nLSlo
f220: 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51  t>=n ) return SQ
f230: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28  LITE_OK;.  n = (
f240: 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77  n+7)&~7;.  paNew
f250: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
f260: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
f270: 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e  (p->aLTerm[0])*n
f280: 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d  );.  if( paNew==
f290: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
f2a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70  E_NOMEM;.  memcp
f2b0: 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65  y(paNew, p->aLTe
f2c0: 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  rm, sizeof(p->aL
f2d0: 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c  Term[0])*p->nLSl
f2e0: 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  ot);.  if( p->aL
f2f0: 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53  Term!=p->aLTermS
f300: 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62  pace ) sqlite3Db
f310: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65  Free(db, p->aLTe
f320: 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  rm);.  p->aLTerm
f330: 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e   = paNew;.  p->n
f340: 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74  LSlot = n;.  ret
f350: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f360: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
f370: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
f380: 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69  e second pLoop i
f390: 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a  nto the first..*
f3a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
f3b0: 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74  reLoopXfer(sqlit
f3c0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
f3d0: 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f  p *pTo, WhereLoo
f3e0: 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65  p *pFrom){.  whe
f3f0: 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
f400: 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28  (db, pTo);.  if(
f410: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
f420: 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d  (db, pTo, pFrom-
f430: 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  >nLTerm) ){.    
f440: 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20  memset(&pTo->u, 
f450: 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75  0, sizeof(pTo->u
f460: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
f470: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f480: 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70  .  memcpy(pTo, p
f490: 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50  From, WHERE_LOOP
f4a0: 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d  _XFER_SZ);.  mem
f4b0: 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c  cpy(pTo->aLTerm,
f4c0: 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20   pFrom->aLTerm, 
f4d0: 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65  pTo->nLTerm*size
f4e0: 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30  of(pTo->aLTerm[0
f4f0: 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  ]));.  if( pFrom
f500: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f510: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
f520: 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76  {.    pFrom->u.v
f530: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
f540: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
f550: 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20  From->wsFlags & 
f560: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
f570: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f  )!=0 ){.    pFro
f580: 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  m->u.btree.pInde
f590: 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  x = 0;.  }.  ret
f5a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f5b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
f5c0: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
f5d0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
f5e0: 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
f5f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
f600: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77  ereLoop *p){.  w
f610: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
f620: 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , p);.  sqlite3D
f630: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
f640: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
f650: 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
f660: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
f670: 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
f680: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
f690: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
f6a0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49    if( ALWAYS(pWI
f6b0: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  nfo) ){.    int 
f6c0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
f6d0: 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
f6e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68  ; i++){.      Wh
f6f0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
f700: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
f710: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
f720: 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70  el->pWLoop && (p
f730: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
f740: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
f750: 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20  N_ABLE) ){.     
f760: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f770: 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
f780: 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
f790: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
f7a0: 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
f7b0: 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
f7c0: 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  WC);.    while( 
f7d0: 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29  pWInfo->pLoops )
f7e0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  {.      WhereLoo
f7f0: 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  p *p = pWInfo->p
f800: 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49  Loops;.      pWI
f810: 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d  nfo->pLoops = p-
f820: 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
f830: 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
f840: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  e(db, p);.    }.
f850: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f860: 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
f870: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f880: 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f  rn TRUE if all o
f890: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f8a0: 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
f8b0: 20 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65    (1)  X has the
f8c0: 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
f8d0: 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20  ost that Y.**   
f8e0: 28 32 29 20 20 58 20 69 73 20 61 20 70 72 6f 70  (2)  X is a prop
f8f0: 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a  er subset of Y.*
f900: 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69 70 73  *   (3)  X skips
f910: 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e   at least as man
f920: 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a  y columns as Y.*
f930: 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20  *.** By "proper 
f940: 73 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20  subset" we mean 
f950: 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
f960: 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  r WHERE clause t
f970: 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61  erms.** than Y a
f980: 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
f990: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
f9a0: 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
f9b0: 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a  o used.** by Y..
f9c0: 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20  **.** If X is a 
f9d0: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
f9e0: 20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62   Y then Y is a b
f9f0: 65 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64  etter choice and
fa00: 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76   ought.** to hav
fa10: 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20  e a lower cost. 
fa20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
fa30: 74 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20  turns TRUE when 
fa40: 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65  that cost .** re
fa50: 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e  lationship is in
fa60: 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73  verted and needs
fa70: 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e   to be adjusted.
fa80: 20 20 54 68 65 20 74 68 69 72 64 20 72 75 6c 65    The third rule
fa90: 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65  .** was added be
faa0: 63 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20  cause if X uses 
fab0: 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74  skip-scan less t
fac0: 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d  han Y it still m
fad0: 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20  ight.** deserve 
fae0: 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65  a lower cost eve
faf0: 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f  n if it is a pro
fb00: 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e  per subset of Y.
fb10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fb20: 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
fb30: 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63  roperSubset(.  c
fb40: 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
fb50: 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  pX,       /* Fir
fb60: 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  st WhereLoop to 
fb70: 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e  compare */.  con
fb80: 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59  st WhereLoop *pY
fb90: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
fba0: 72 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  re against this 
fbb0: 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a  WhereLoop */.){.
fbc0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66    int i, j;.  if
fbd0: 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d  ( pX->nLTerm-pX-
fbe0: 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c  >nSkip >= pY->nL
fbf0: 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29  Term-pY->nSkip )
fc00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
fc10: 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75  /* X is not a su
fc20: 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d  bset of Y */.  }
fc30: 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70  .  if( pY->nSkip
fc40: 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72   > pX->nSkip ) r
fc50: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
fc60: 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72  X->rRun >= pY->r
fc70: 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Run ){.    if( p
fc80: 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52  X->rRun > pY->rR
fc90: 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  un ) return 0;  
fca0: 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72    /* X costs mor
fcb0: 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20  e than Y */.    
fcc0: 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70  if( pX->nOut > p
fcd0: 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e  Y->nOut ) return
fce0: 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
fcf0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
fd00: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d  .  }.  for(i=pX-
fd10: 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  >nLTerm-1; i>=0;
fd20: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70   i--){.    if( p
fd30: 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20  X->aLTerm[i]==0 
fd40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fd50: 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d  for(j=pY->nLTerm
fd60: 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
fd70: 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c        if( pY->aL
fd80: 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54  Term[j]==pX->aLT
fd90: 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  erm[i] ) break;.
fda0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
fdb0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
fdc0: 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74  * X not a subset
fdd0: 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d   of Y since term
fde0: 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62   X[i] not used b
fdf0: 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  y Y */.  }.  ret
fe00: 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
fe10: 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
fe20: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
fe30: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
fe40: 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
fe50: 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
fe60: 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
fe70: 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
fe80: 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
fe90: 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
fea0: 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
feb0: 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
fec0: 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
fed0: 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
fee0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
fef0: 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
ff00: 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
ff10: 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
ff20: 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
ff30: 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
ff40: 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
ff50: 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
ff60: 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
ff70: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
ff80: 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
ff90: 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
ffa0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
ffb0: 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
ffc0: 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
ffd0: 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
ffe0: 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
fff0: 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
10000 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
10010 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
10020 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
10030 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
10040 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
10050 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
10060 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
10070 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
10080 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
10090 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
100a0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
100b0 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
100c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
100d0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
100e0 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
100f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10100 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
10110 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
10120 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
10130 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
10140 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
10150 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
10160 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
10170 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
10180 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
10190 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
101a0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
101b0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
101c0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
101d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
101e0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
101f0 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
10200 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
10210 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
10220 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
10230 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
10240 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
10250 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
10260 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
10270 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
10280 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
10290 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
102a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
102b0 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
102c0 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
102d0 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
102e0 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
102f0 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
10300 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10310 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
10320 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
10330 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
10340 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
10350 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
10380 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
10390 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
103a0 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
103b0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
103c0 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
103d0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
103e0 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
103f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10400 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
10410 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
10420 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
10430 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
10440 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70  at can be.** sup
10450 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70  planted by pTemp
10460 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  late..**.** Retu
10470 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57  rn NULL if the W
10480 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f  hereLoop list co
10490 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20  ntains an entry 
104a0 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e  that can supplan
104b0 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20  t.** pTemplate, 
104c0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
104d0 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73  f pTemplate does
104e0 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74   not belong on t
104f0 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  he list..**.** I
10500 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
10510 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
10520 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c  te can supplant,
10530 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
10540 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f  .** link that po
10550 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a  ints to pX..**.*
10560 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63  * If pTemplate c
10570 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61  annot supplant a
10580 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d  ny existing elem
10590 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  ent of the list 
105a0 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20  but needs.** to 
105b0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
105c0 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72  list, then retur
105d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
105e0 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  he tail of the l
105f0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
10600 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
10610 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
10620 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
10630 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
10640 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
10650 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
10660 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
10670 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
10680 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
10690 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
106a0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
106b0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
106c0 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
106d0 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
106e0 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
106f0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
10700 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
10710 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
10720 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
10730 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
10740 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
10750 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
10760 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
10770 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
10780 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
10790 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
107a0 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
107b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
107c0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
107d0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
107e0 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
107f0 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
10800 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
10810 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
10820 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
10830 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
10840 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
10850 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
10860 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
10870 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
10880 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
10890 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
108a0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
108b0 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
108c0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
108d0 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
108e0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
108f0 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
10900 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
10910 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
10920 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
10930 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
10940 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
10950 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
10960 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
10970 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
10980 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
10990 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
109a0 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
109b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
109c0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
109d0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
109e0 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
109f0 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
10a00 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
10a10 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
10a20 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
10a30 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
10a40 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
10a50 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
10a60 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
10a70 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
10a80 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
10a90 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
10aa0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
10ab0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10ac0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
10ad0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
10ae0 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
10af0 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
10b00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10b10 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
10b20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
10b30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10b40 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
10b50 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
10b60 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
10b70 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
10b80 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
10b90 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
10ba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10bb0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
10bc0 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
10bd0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
10be0 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
10bf0 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
10c00 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
10c10 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
10c20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
10c30 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
10c40 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
10c50 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
10c60 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
10c70 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
10c80 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
10c90 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
10ca0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
10cb0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
10cc0 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
10cd0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
10ce0 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
10cf0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
10d20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
10d30 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
10d60 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
10d70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
10da0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
10db0 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
10dc0 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
10dd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10de0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
10df0 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
10e00 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
10e10 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
10e20 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
10e30 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
10e40 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
10e50 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
10e60 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
10e70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
10e80 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
10e90 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
10ea0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
10eb0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
10ec0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
10ed0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
10ee0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
10ef0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
10f00 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
10f10 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
10f20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
10f30 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
10f60 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
10f70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
10f80 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
10fb0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
10fc0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
10fd0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
10fe0 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
10ff0 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
11000 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
11010 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
11020 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
11030 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
11040 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
11050 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
11060 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
11070 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
11080 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
11090 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
110a0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
110b0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
110c0 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
110d0 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
110e0 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
110f0 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
11100 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
11110 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
11120 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
11130 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
11140 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
11150 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
11160 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
11170 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
11180 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
11190 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
111a0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
111b0 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
111c0 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
111d0 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
111e0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
111f0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
11200 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
11210 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
11220 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
11230 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
11240 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
11250 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
11260 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
11270 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
11280 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
11290 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
112a0 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
112b0 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
112c0 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
112d0 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
112e0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
112f0 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
11300 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
11310 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
11320 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
11330 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
11340 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
11350 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
11360 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
11370 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
11380 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
11390 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
113a0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
113b0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
113c0 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
113d0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
113e0 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
113f0 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
11400 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
11410 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
11420 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
11430 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
11440 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
11450 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
11460 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
11470 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
11480 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
11490 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
114a0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
114b0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
114c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
114d0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
114e0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
114f0 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
11500 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
11510 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
11520 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
11530 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
11540 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
11550 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11560 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
11570 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42  >db;..  /* If pB
11580 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
11590 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
115a0 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20  only keep track 
115b0 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a  of the costs.  *
115c0 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20  * and prereqs.. 
115d0 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
115e0 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b  er->pOrSet!=0 ){
115f0 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61  .    if( pTempla
11600 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69  te->nLTerm ){.#i
11610 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
11620 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e  BLED.      u16 n
11630 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
11640 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e  Set->n;.      in
11650 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
11660 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
11670 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
11680 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
11690 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
116a0 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
116d0 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
116e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
116f0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
11700 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
11710 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
11720 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11730 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f  e3DebugPrintf(x?
11740 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20  "   or-%d:  ":" 
11750 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a    or-X:  ", n);.
11760 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
11770 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
11780 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
11790 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
117a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
117b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
117c0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..  /* Look for 
117d0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
117e0 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65  eLoop to replace
117f0 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a   with pTemplate.
11800 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70    */.  whereLoop
11810 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66  AdjustCost(pWInf
11820 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
11830 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20  late);.  ppPrev 
11840 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
11850 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70  esser(&pWInfo->p
11860 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
11870 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76  );..  if( ppPrev
11880 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
11890 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
118a0 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ts a WhereLoop o
118b0 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  n the list that 
118c0 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
118d0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
118e0 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20   so just ignore 
118f0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66  pTemplate */.#if
11900 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
11910 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
11920 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11930 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11950 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b  bugPrintf("   sk
11960 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ip: ");.      wh
11970 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
11980 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
11990 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
119a0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
119b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d  SQLITE_OK;  .  }
119c0 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70  else{.    p = *p
119d0 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pPrev;.  }..  /*
119e0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
119f0 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
11a00 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
11a10 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
11a20 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
11a30 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
11a40 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
11a50 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
11a60 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
11a70 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
11a80 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
11a90 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11aa0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
11ab0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
11ac0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
11ad0 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
11ae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11af0 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70  DebugPrintf("rep
11b00 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20  lace: ");.      
11b10 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
11b20 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
11b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11b40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
11b50 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20      add: ");.   
11b60 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
11b70 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
11b80 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
11b90 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30  endif.  if( p==0
11ba0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   ){.    /* Alloc
11bb0 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ate a new WhereL
11bc0 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68  oop to add to th
11bd0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
11be0 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76  t */.    *ppPrev
11bf0 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62   = p = sqlite3Db
11c00 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
11c10 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
11c20 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
11c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11c40 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
11c50 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
11c60 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
11c70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
11c80 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
11c90 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
11ca0 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
11cb0 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
11cc0 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
11cd0 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
11ce0 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
11cf0 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
11d00 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
11d10 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
11d20 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
11d30 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
11d40 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
11d50 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
11d60 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
11d70 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
11d80 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
11d90 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
11da0 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
11db0 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
11dc0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
11dd0 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20    if( ppTail==0 
11de0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
11df0 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b  ToDel = *ppTail;
11e00 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65  .      if( pToDe
11e10 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
11e20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54      *ppTail = pT
11e30 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  oDel->pNextLoop;
11e40 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11e50 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
11e60 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
11e70 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
11e80 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
11e90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
11ea0 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a  f(" delete: ");.
11eb0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
11ec0 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
11ed0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11ee0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
11ef0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
11f00 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
11f10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
11f20 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
11f30 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
11f40 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
11f50 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
11f60 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
11f70 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
11f80 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
11f90 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
11fa0 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
11fb0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
11fc0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
11fd0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
11fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11ff0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
12000 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
12010 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
12020 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
12030 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
12040 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
12050 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
12060 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
12070 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
12080 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
12090 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57  *.** For every W
120a0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
120b0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
120c0 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
120d0 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20  * and which has 
120e0 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  a truth probabil
120f0 69 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20  ity assigned by 
12100 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c  one of the likel
12110 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65  ihood(),.** like
12120 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c  ly(), or unlikel
12130 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  y() SQL function
12140 73 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73  s, reduce the es
12150 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a  timated number.*
12160 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
12170 20 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c   by the probabil
12180 69 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ity specified..*
12190 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f  *.** TUNING:  Fo
121a0 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
121b0 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
121c0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
121d0 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
121e0 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61  hich does not ha
121f0 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74  ve an assigned t
12200 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12210 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20  , heuristics.** 
12220 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20  described below 
12230 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20  are used to try 
12240 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
12250 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12260 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50  y..** TODO --> P
12270 65 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73  erhaps this is s
12280 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f  omething that co
12290 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20  uld be improved 
122a0 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62  by better.** tab
122b0 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a  le statistics..*
122c0 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31  *.** Heuristic 1
122d0 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  :  Estimate the 
122e0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
122f0 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68  y as 93.75%.  Th
12300 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75  e 93.75%.** valu
12310 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  e corresponds to
12320 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f   -1 in LogEst no
12330 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20  tation, so this 
12340 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a  means decrement.
12350 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ** the WhereLoop
12360 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20  .nOut field for 
12370 65 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45  every such WHERE
12380 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
12390 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a  .** Heuristic 2:
123a0 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74    If there exist
123b0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  s one or more WH
123c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
123d0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
123e0 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58  "x==EXPR" and EX
123f0 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  PR is not a cons
12400 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65  tant 0 or 1, the
12410 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a  n make sure the.
12420 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20  ** final output 
12430 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20  row estimate is 
12440 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  no greater than 
12450 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  1/4 of the total
12460 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
12470 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
12480 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12490 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d  , assume that x=
124a0 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65  =EXPR will filte
124b0 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73  r.** out at leas
124c0 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77  t 3 out of 4 row
124d0 73 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d  s.  If EXPR is -
124e0 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65  1 or 0 or 1, the
124f0 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22  n maybe the.** "
12500 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f  x" column is boo
12510 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20  lean or else -1 
12520 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63  or 0 or 1 is a c
12530 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61  ommon default va
12540 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78  lue.** on the "x
12550 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20  " column and so 
12560 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  in that case onl
12570 79 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74  y cap the output
12580 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a   row estimate.**
12590 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20   at 1/2 instead 
125a0 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69  of 1/4..*/.stati
125b0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
125c0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
125d0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
125e0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
125f0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12600 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
12610 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
12620 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
12630 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
12640 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
12650 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
12660 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
12670 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
12680 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
12690 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
126a0 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
126b0 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
126c0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
126d0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
126e0 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65 20   LogEst iReduce 
126f0 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70  = 0;    /* pLoop
12700 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f  ->nOut should no
12710 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52  t exceed nRow-iR
12720 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65  educe */..  asse
12730 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
12740 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
12750 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
12760 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
12770 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
12780 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b  i>0; i--, pTerm+
12790 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
127a0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
127b0 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
127c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
127d0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
127e0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
127f0 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  elf)==0 ) contin
12800 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
12810 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
12820 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29  notAllowed)!=0 )
12830 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
12840 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  or(j=pLoop->nLTe
12850 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
12860 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f  {.      pX = pLo
12870 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
12880 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
12890 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
128a0 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29   if( pX==pTerm )
128b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
128c0 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  ( pX->iParent>=0
128d0 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d   && (&pWC->a[pX-
128e0 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72  >iParent])==pTer
128f0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  m ) break;.    }
12900 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a  .    if( j<0 ){.
12910 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
12920 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
12930 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
12940 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12950 74 79 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ty is specified 
12960 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69  using the likeli
12970 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20  hood() hints,.  
12980 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73        ** then us
12990 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  e the probabilit
129a0 79 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  y provided by th
129b0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a  e application. *
129c0 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
129d0 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
129e0 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
129f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12a00 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  /* In the absenc
12a10 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72  e of explicit tr
12a20 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65  uth probabilitie
12a30 73 2c 20 75 73 65 20 68 65 75 72 69 73 74 69 63  s, use heuristic
12a40 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  s to.        ** 
12a50 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62  guess a reasonab
12a60 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  le truth probabi
12a70 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lity. */.       
12a80 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a   pLoop->nOut--;.
12a90 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
12aa0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f  m->eOperator&(WO
12ab0 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20  _EQ|WO_IS) ){.  
12ac0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
12ad0 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
12ae0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
12af0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12b00 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
12b10 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
12b20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12b30 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
12b40 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e  Right, &k) && k>
12b50 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b  =(-1) && k<=1 ){
12b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
12b70 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   10;.          }
12b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12b90 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20    k = 20;.      
12ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12bb0 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20  if( iReduce<k ) 
12bc0 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20  iReduce = k;.   
12bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12be0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
12bf0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f  Loop->nOut > nRo
12c00 77 2d 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f  w-iReduce )  pLo
12c10 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20  op->nOut = nRow 
12c20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a  - iReduce;.}../*
12c30 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63  .** Adjust the c
12c40 6f 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73  ost C by the cos
12c50 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20  tMult facter T. 
12c60 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72   This only occur
12c70 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64  s if.** compiled
12c80 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45   with -DSQLITE_E
12c90 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a  NABLE_COSTMULT.*
12ca0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12cb0 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a  ENABLE_COSTMULT.
12cc0 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
12cd0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
12ce0 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a  )  C += T.#else.
12cf0 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
12d00 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
12d10 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12d20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
12d30 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
12d40 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
12d50 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
12d60 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78  .** index pIndex
12d70 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  . Try to match o
12d80 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57  ne more..**.** W
12d90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12da0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75  n is called, pBu
12db0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75  ilder->pNew->nOu
12dc0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a  t contains the .
12dd0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
12de0 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65  s expected to be
12df0 20 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74   visited by filt
12e00 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  ering using the 
12e10 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  nEq .** terms on
12e20 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64  ly. If it is mod
12e30 69 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75  ified, this valu
12e40 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65  e is restored be
12e50 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
12e60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
12e70 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
12e80 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
12e90 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
12ea0 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
12eb0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
12ec0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
12ed0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12ee0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
12ef0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
12f00 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
12f10 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
12f20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
12f30 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
12f40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
12f50 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
12f60 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
12f70 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
12f80 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12fa0 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
12fb0 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rc */.  LogEst n
12fc0 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
12fe0 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
12ff0 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
13000 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
13010 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
13020 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
13030 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
13040 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
13050 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
13060 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
13070 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13080 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
13090 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
130a0 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
130b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
130c0 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
130d0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
130e0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
130f0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
13100 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
13110 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
13120 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
13130 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
13140 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
13150 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
13160 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
13170 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
13180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13190 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
131a0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
131b0 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
131c0 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
131d0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
131e0 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
131f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
13200 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
13210 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13220 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13230 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
13240 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
13250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13260 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
13270 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
13280 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71  .  u16 saved_nEq
13290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
132a0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
132b0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
132c0 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
132d0 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20  16 saved_nSkip; 
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132f0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
13300 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20   of pNew->nSkip 
13310 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
13320 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
13330 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13340 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13350 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
13360 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13380 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
13390 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
133a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
133b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
133c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
133d0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
133e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
133f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13400 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
13410 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
13420 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
13430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
13440 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
13450 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
13460 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
13470 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
13480 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
13490 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
134a0 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
134b0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
134c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
134d0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
134e0 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
134f0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13500 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
13510 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
13520 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
13530 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
13540 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
13550 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
13560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
13570 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
13580 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
13590 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
135a0 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  /*pProbe->tnum<=
135b0 30 20 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67  0 ||*/ (pSrc->fg
135c0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
135d0 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
135e0 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
135f0 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
13600 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
13610 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
13620 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
13630 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
13640 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_LE|WO_ISNULL
13650 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66  |WO_IS;.  }.  if
13660 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  ( pProbe->bUnord
13670 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d  ered ) opMask &=
13680 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57   ~(WO_GT|WO_GE|W
13690 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20  O_LT|WO_LE);..  
136a0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
136b0 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65  btree.nEq<pProbe
136c0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20  ->nColumn );..  
136d0 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
136e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
136f0 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
13700 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
13710 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
13720 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
13730 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
13740 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
13750 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
13760 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
13770 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
13780 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
13790 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
137a0 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
137b0 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
137c0 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
137f0 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
13800 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
13810 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
13820 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
13830 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
13840 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
13850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13860 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
13870 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
13880 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
13890 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
138a0 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
138b0 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
138c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
138d0 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
138e0 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
138f0 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
13900 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
13910 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
13920 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
13930 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
13940 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
13950 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
13960 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
13970 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
13980 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
13990 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
139a0 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
139b0 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
139c0 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
139d0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
139e0 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
139f0 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
13a00 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
13a10 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
13a20 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
13a30 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
13a40 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
13a50 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
13a60 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
13a70 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
13a80 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
13a90 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
13aa0 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
13ab0 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
13ac0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
13ad0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
13ae0 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
13af0 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
13b00 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
13b10 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
13b20 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
13b30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
13b40 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
13b50 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
13b60 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
13b70 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13b80 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
13b90 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  s;.    pNew->u.b
13ba0 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
13bb0 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
13bc0 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
13bd0 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
13be0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
13bf0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
13c00 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
13c10 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
13c20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
13c30 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
13c40 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
13c50 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
13c60 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
13c70 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
13c80 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
13c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e  .    assert( nIn
13ca0 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  Mul==0.        |
13cb0 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
13cc0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
13cd0 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20  NULL)!=0 .      
13ce0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
13cf0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
13d00 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20  MN_IN)!=0 .     
13d10 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
13d20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
13d30 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29  PSCAN)!=0 .    )
13d40 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26  ;..    if( eOp &
13d50 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
13d60 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
13d70 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
13d80 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
13d90 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
13da0 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  IN;.      if( Ex
13db0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
13dc0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
13dd0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
13de0 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
13df0 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74  ..)":  TUNING: t
13e00 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
13e10 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
13e20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20       nIn = 46;  
13e30 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69  assert( 46==sqli
13e40 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b  te3LogEst(25) );
13e50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13e60 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
13e70 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
13e80 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
13e90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
13ea0 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
13eb0 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
13ec0 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74       nIn = sqlit
13ed0 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e  e3LogEst(pExpr->
13ee0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  x.pList->nExpr);
13ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13f00 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20  ssert( nIn>0 ); 
13f10 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68   /* RHS always h
13f20 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72  as 2 or more ter
13f30 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65  ms...  The parse
13f40 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
13f50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61            ** cha
13f60 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20  nges "x IN (?)" 
13f70 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a  into "x=?". */..
13f80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
13f90 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
13fa0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13fb0 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
13fc0 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
13fd0 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ];.      pNew->w
13fe0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13ff0 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
14000 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e   assert( saved_n
14010 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Eq==pNew->u.btre
14020 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69  e.nEq );.      i
14030 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
14040 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43  D .       || (iC
14050 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  ol>0 && nInMul==
14060 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d  0 && saved_nEq==
14070 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d  pProbe->nKeyCol-
14080 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
14090 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
140a0 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e  && pProbe->uniqN
140b0 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
140c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
140d0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
140e0 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
140f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14100 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14110 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
14120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14130 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
14140 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
14150 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
14160 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14170 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
14180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
14190 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
141a0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
141b0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
141c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
141d0 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
141e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
141f0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
14200 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
14210 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
14220 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
14230 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
14240 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
14250 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
14260 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
14270 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e      /* Range con
14280 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
14290 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  e from the LIKE 
142a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65  optimization are
142b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
142c0 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73  ys used in pairs
142d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  . */.        pTo
142e0 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20  p = &pTerm[1];. 
142f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
14300 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43  pTop-(pTerm->pWC
14310 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43  ->a))<pTerm->pWC
14320 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  ->nTerm );.     
14330 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
14340 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
14350 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20  LIKEOPT );.     
14360 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
14370 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
14380 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
14390 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
143a0 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
143b0 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
143c0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
143d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
143e0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
143f0 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20  +] = pTop;.     
14400 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14410 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
14420 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MIT;.      }.   
14430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
14440 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
14450 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
14460 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
14470 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
14480 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14490 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
144a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
144b0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
144c0 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
144d0 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
144e0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
144f0 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
14500 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
14510 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
14540 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
14550 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  : 0;.    }..    
14560 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
14570 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73   pNew->nOut is s
14580 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
14590 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
145a0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76  d to.    ** be v
145b0 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e  isited by the in
145c0 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20  dex scan before 
145d0 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d  considering term
145e0 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20   pTerm, or the. 
145f0 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20     ** values of 
14600 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20  nIn and nInMul. 
14610 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
14620 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c  assuming that al
14630 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28  l .    ** "x IN(
14640 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20  ...)" terms are 
14650 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78  replaced with "x
14660 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63   = ?". This bloc
14670 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a  k updates.    **
14680 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e   the value of pN
14690 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f  ew->nOut to acco
146a0 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62  unt for pTerm (b
146b0 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75  ut not nIn/nInMu
146c0 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  l).  */.    asse
146d0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
146e0 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
146f0 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
14700 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14710 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
14720 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
14730 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61   using stat3/sta
14740 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20  t4 data. Or, if 
14750 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
14760 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a  3/stat4.      **
14770 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d   data, using som
14780 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65  e other estimate
14790 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72  .  */.      wher
147a0 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
147b0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
147c0 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
147d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
147e0 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b      int nEq = ++
147f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14800 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  q;.      assert(
14810 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c   eOp & (WO_ISNUL
14820 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  L|WO_EQ|WO_IN|WO
14830 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61  _IS) );..      a
14840 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14850 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14860 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
14870 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26  ->truthProb<=0 &
14880 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  & pProbe->aiColu
14890 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30  mn[saved_nEq]>=0
148a0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
148b0 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e  rt( (eOp & WO_IN
148c0 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20  ) || nIn==0 );. 
148d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
148e0 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a   eOp & WO_IN );.
148f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
14900 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
14910 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20  thProb;.        
14920 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
14930 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
14940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14950 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
14960 41 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77  AT4.        tRow
14970 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
14980 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c        if( nInMul
14990 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
149a0 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65   pProbe->nSample
149b0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e   .         && pN
149c0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
149d0 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
149e0 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  Col.         && 
149f0 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d  ((eOp & WO_IN)==
14a00 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  0 || !ExprHasPro
14a10 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
14a20 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
14a30 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
14a40 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
14a50 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
14a60 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
14a70 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  ( (eOp & (WO_EQ|
14a80 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29  WO_ISNULL|WO_IS)
14a90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14ab0 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  p & WO_EQ );.   
14ac0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14ad0 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29  e( eOp & WO_IS )
14ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
14af0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14b00 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
14b10 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14b20 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
14b30 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
14b40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
14b50 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
14b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14b70 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
14b80 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
14b90 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
14ba0 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
14bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14bc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
14bd0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14be0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14c00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14c10 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
14c20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74  /* Jump out of t
14c30 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f  he pTerm loop */
14c40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
14c50 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Out ){.         
14c60 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
14c70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f  sqlite3LogEst(nO
14c80 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
14c90 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e   if( pNew->nOut>
14ca0 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65  saved_nOut ) pNe
14cb0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
14cc0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  nOut;.          
14cd0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
14ce0 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nIn;.          }
14cf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14d00 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29     if( nOut==0 )
14d10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
14d20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
14d30 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62  ->nOut += (pProb
14d40 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
14d50 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69  Eq] - pProbe->ai
14d60 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d  RowLogEst[nEq-1]
14d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
14d80 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
14d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14da0 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
14db0 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69  ere is no likeli
14dc0 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73  hood() value, as
14dd0 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20  sume that a .   
14de0 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c           ** "col
14df0 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73   IS NULL" expres
14e00 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69  sion matches twi
14e10 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20  ce as many rows 
14e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14e30 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20  as (col=?). */. 
14e40 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
14e50 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20  >nOut += 10;.   
14e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14e70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14e80 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f  ..    /* Set rCo
14e90 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73  stIdx to the cos
14ea0 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65  t of visiting se
14eb0 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69  lected rows in i
14ec0 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a  ndex. Add.    **
14ed0 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75   it to pNew->rRu
14ee0 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72  n, which is curr
14ef0 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65  ently set to the
14f00 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64   cost of the ind
14f10 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  ex.    ** seek o
14f20 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  nly. Then, if th
14f30 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
14f40 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20  ring index, add 
14f50 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
14f60 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  ** visiting the 
14f70 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
14f80 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
14f90 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d  rCostIdx = pNew-
14fa0 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a  >nOut + 1 + (15*
14fb0 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
14fc0 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a  )/pSrc->pTab->sz
14fd0 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  TabRow;.    pNew
14fe0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
14ff0 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
15000 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20  ze, rCostIdx);. 
15010 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
15020 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
15030 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
15040 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
15050 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
15060 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
15070 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
15080 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20  nOut + 16);.    
15090 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d  }.    ApplyCostM
150a0 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
150b0 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54  rRun, pProbe->pT
150c0 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  able->costMult);
150d0 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75  ..    nOutUnadju
150e0 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  sted = pNew->nOu
150f0 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  t;.    pNew->rRu
15100 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  n += nInMul + nI
15110 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  n;.    pNew->nOu
15120 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  t += nInMul + nI
15130 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  n;.    whereLoop
15140 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75  OutputAdjust(pBu
15150 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77  ilder->pWC, pNew
15160 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  , rSize);.    rc
15170 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
15180 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
15190 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
151a0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
151b0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
151c0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
151d0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
151e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
151f0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15200 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a  nOutUnadjusted;.
15210 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
15220 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15230 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
15240 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
15250 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
15260 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  robe->nColumn.  
15270 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
15280 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15290 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
152a0 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
152b0 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
152c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
152d0 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
152e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
152f0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
15300 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
15310 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
15320 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
15330 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
15340 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
15350 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
15360 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
15370 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
15380 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
15390 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
153a0 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
153b0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
153c0 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
153d0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
153e0 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
153f0 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
15400 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
15410 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
15420 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
15430 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
15440 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
15450 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
15460 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
15470 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
15480 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
15490 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
154a0 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
154b0 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
154c0 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
154d0 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
154e0 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
154f0 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
15500 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
15510 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
15520 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
15530 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
15540 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
15550 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
15560 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
15570 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
15580 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
15590 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
155a0 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
155b0 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
155c0 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
155d0 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
155e0 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
155f0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
15600 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
15610 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
15620 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
15630 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
15640 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
15650 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
15660 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
15670 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
15680 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
15690 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
156a0 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
156b0 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
156c0 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  =0.   && pProbe-
156d0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
156e0 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f  ed_nEq+1]>=42  /
156f0 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
15700 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
15710 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77  */.   && (rc = w
15720 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
15730 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
15740 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54  LTerm+1))==SQLIT
15750 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  E_OK.  ){.    Lo
15760 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
15770 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
15780 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  q++;.    pNew->n
15790 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
157a0 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
157b0 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
157c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
157d0 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
157e0 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70  N;.    nIter = p
157f0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
15800 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20  st[saved_nEq] - 
15810 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
15820 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
15830 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
15840 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f   -= nIter;.    /
15850 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75  * TUNING:  Becau
15860 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73  se uncertainties
15870 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
15880 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  s for skip-scan 
15890 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20  queries,.    ** 
158a0 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67  add a 1.375 fudg
158b0 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65  e factor to make
158c0 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68   skip-scan sligh
158d0 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e  tly less likely.
158e0 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d   */.    nIter +=
158f0 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f   5;.    whereLoo
15900 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
15910 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
15920 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e  Probe, nIter + n
15930 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77  InMul);.    pNew
15940 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15950 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Out;.    pNew->u
15960 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
15970 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
15980 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
15990 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d  nSkip;.    pNew-
159a0 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
159b0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20  _wsFlags;.  }.. 
159c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
159d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
159e0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
159f0 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
15a00 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
15a10 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
15a20 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
15a30 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
15a40 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
15a50 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
15a60 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
15a70 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
15a80 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
15a90 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
15aa0 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
15ab0 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
15ac0 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
15ad0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
15ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
15af0 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
15b00 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
15b10 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
15b20 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
15b30 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
15b40 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
15b50 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
15b60 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
15b70 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
15b80 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
15b90 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
15ba0 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
15bb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
15bc0 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
15bd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
15be0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
15bf0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
15c00 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
15c10 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
15c20 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
15c30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
15c40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15c50 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
15c60 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
15c70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
15c80 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
15c90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
15ca0 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
15cb0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
15cc0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
15cd0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
15ce0 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
15cf0 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
15d00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15d10 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
15d20 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
15d30 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
15d40 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
15d50 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
15d60 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
15d70 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
15d80 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
15d90 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
15da0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
15db0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
15dc0 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  pr,aColExpr->a[j
15dd0 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72  j].pExpr,iCursor
15de0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15df0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15e00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15e10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15e20 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
15e30 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68  urn a bitmask wh
15e40 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20  ere 1s indicate 
15e50 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70  that the corresp
15e60 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66  onding column of
15e70 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73  .** the table is
15e80 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
15e90 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
15ea0 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72  st 63 columns ar
15eb0 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  e considered..*/
15ec0 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
15ed0 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49  columnsInIndex(I
15ee0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42  ndex *pIdx){.  B
15ef0 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
15f00 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70  int j;.  for(j=p
15f10 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  Idx->nColumn-1; 
15f20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
15f30 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
15f40 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
15f50 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
15f60 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
15f70 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
15f80 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20  tcase( x==BMS-2 
15f90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42  );.      if( x<B
15fa0 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
15fb0 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(x);.    }.  
15fc0 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
15fd0 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
15fe0 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
15ff0 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
16000 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
16010 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
16020 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
16030 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
16040 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
16050 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
16060 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
16070 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
16080 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
16090 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
160a0 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
160b0 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
160c0 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28  *pTerm;.  while(
160d0 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
160e0 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21  AND ){.    if( !
160f0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
16100 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43  alIndex(iTab,pWC
16110 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20  ,pWhere->pLeft) 
16120 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
16130 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
16140 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66  >pRight;.  }.  f
16150 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
16160 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
16170 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
16180 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
16190 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
161a0 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
161b0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
161c0 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  r(pExpr, pWhere,
161d0 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20   iTab) .     && 
161e0 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  (!ExprHasPropert
161f0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
16200 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e  Join) || pExpr->
16210 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
16220 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20  =iTab).    ){.  
16230 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16240 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16250 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
16260 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
16270 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
16280 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
16290 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
162a0 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
162b0 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
162c0 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
162d0 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
162e0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
162f0 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
16300 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
16310 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
16320 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
16330 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
16340 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
16350 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
16360 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
16370 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
16380 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
16390 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
163a0 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
163b0 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
163c0 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
163d0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
163e0 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
163f0 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
16400 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
16410 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
16420 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
16430 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
16440 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
16450 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
16460 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
16480 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
16490 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
164a0 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
164b0 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
164c0 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
164d0 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
164e0 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
164f0 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
16500 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
16510 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
16520 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
16530 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
16540 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
16550 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
16560 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
16570 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
16580 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16590 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
165a0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
165b0 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
165c0 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
165d0 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
165e0 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
165f0 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
16600 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
16610 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
16620 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
16630 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
16640 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
16650 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
16660 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
16670 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
16680 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
16690 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
166a0 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
166b0 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
166c0 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
166d0 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
166e0 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
166f0 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
16700 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
16710 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
16720 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
16730 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
16740 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
16750 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c  ed values (nRow,
16760 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20   nVisit, nSeek) 
16770 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20  often contain a 
16780 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  large amount.** 
16790 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20  of uncertainty. 
167a0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
167b0 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73  , scoring is des
167c0 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c  igned to pick pl
167d0 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20  ans that.** "do 
167e0 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20  the least harm" 
167f0 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  if the estimates
16800 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e   are inaccurate.
16810 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61    For example, a
16820 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61  .** log(nRow) fa
16830 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
16840 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  from a non-cover
16850 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
16860 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69  n order to.** bi
16870 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69  as the scoring i
16880 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67  n favor of using
16890 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65   an index, since
168a0 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a   the worst-case.
168b0 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ** performance o
168c0 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
168d0 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74   is far better t
168e0 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61  han the worst-ca
168f0 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  se performance.*
16900 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  * of a full tabl
16910 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
16920 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
16930 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
16940 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
16950 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
16960 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
16970 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
16980 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
16990 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
169a0 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
169b0 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
169c0 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
169d0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
169e0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
169f0 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
16a00 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
16a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16a20 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
16a30 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
16a40 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a60 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
16a70 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
16a80 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f  mary key */.  Lo
16a90 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  gEst aiRowEstPk[
16aa0 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2];       /* The
16ab0 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76   aiRowLogEst[] v
16ac0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
16ad0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
16ae0 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
16af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
16b00 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
16b10 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16b20 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
16b30 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
16b40 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
16b50 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
16b60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
16b70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
16b80 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
16b90 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
16ba0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16bc0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
16bd0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
16be0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16bf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
16c00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
16c10 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
16c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16c30 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
16c40 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
16c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16c60 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
16c70 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c90 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
16ca0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
16cb0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
16cc0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
16cd0 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
16ce0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16cf0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
16d00 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
16d10 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
16d20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
16d30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
16d40 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
16d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16d60 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
16d70 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
16d80 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
16d90 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
16da0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
16db0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
16dc0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
16dd0 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
16de0 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
16df0 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
16e00 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
16e10 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
16e20 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
16e30 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
16e40 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
16e50 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  BIndex ){.    /*
16e60 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
16e70 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
16e80 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
16e90 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
16ea0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
16eb0 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  pIBIndex;.  }els
16ec0 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
16ed0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
16ee0 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
16ef0 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
16f00 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
16f10 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
16f20 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
16f30 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
16f40 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
16f50 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
16f60 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
16f70 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
16f80 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
16f90 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
16fa0 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
16fb0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
16fc0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
16fd0 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
16fe0 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
16ff0 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
17000 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17020 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
17030 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
17040 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
17050 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
17060 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
17070 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
17080 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
17090 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
170a0 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
170b0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
170c0 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
170d0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
170e0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
170f0 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
17100 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
17110 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
17120 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
17130 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
17140 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
17150 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
17160 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
17170 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
17180 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
17190 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f   if( pSrc->fg.no
171a0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
171b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
171c0 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
171d0 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
171e0 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
171f0 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
17200 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
17210 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
17220 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17230 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
17240 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
17250 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
17260 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
17270 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  e = pTab->nRowLo
17280 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  gEst;.  rLogSize
17290 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
172a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
172b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
172c0 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f  _INDEX.  /* Auto
172d0 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
172e0 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
172f0 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a  ->pOrSet      /*
17300 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20   Not part of an 
17310 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
17320 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  */.   && (pWInfo
17330 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
17340 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45  HERE_NO_AUTOINDE
17350 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49  X)==0.   && (pWI
17360 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
17370 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
17380 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
17390 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64   && pSrc->pIBInd
173a0 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61  ex==0      /* Ha
173b0 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
173c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
173d0 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64  !pSrc->fg.notInd
173e0 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f  exed   /* Has no
173f0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
17400 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73  use */.   && Has
17410 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20  Rowid(pTab)     
17420 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f      /* Not WITHO
17430 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
17440 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
17450 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
17460 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
17470 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65  d /* Not a corre
17480 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
17490 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
174a0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f  g.isRecursive  /
174b0 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76  * Not a recursiv
174c0 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  e common table e
174d0 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
174e0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
174f0 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
17500 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
17510 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
17520 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
17530 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
17540 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
17550 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
17560 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
17570 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
17580 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
17590 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
175a0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
175b0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
175c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
175d0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
175e0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
175f0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
17600 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
17610 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
17620 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
17630 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
17640 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
17650 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
17660 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
17670 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
17680 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
17690 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
176a0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
176b0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
176c0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
176d0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
176e0 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
176f0 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
17700 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
17710 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
17720 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
17730 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
17740 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
17750 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
17760 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
17770 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20  tables or 1.375 
17780 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76  (LogEst=4) for v
17790 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
177a0 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
177b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
177c0 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
177d0 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
177e0 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
177f0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
17800 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
17810 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
17820 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
17830 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
17840 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
17850 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
17860 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
17870 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
17880 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
17890 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
178a0 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
178b0 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
178c0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
178d0 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
178e0 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20  Size + 4;.      
178f0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
17900 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
17910 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
17920 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
17930 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17940 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20  rSetup += 24;.  
17950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17960 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
17970 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
17980 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
17990 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
179a0 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
179b0 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
179c0 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
179d0 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
179e0 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
179f0 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
17a00 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
17a10 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
17a20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
17a30 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
17a40 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
17a50 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
17a60 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
17a70 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
17a80 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
17a90 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
17aa0 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
17ab0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
17ac0 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
17ad0 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
17ae0 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
17af0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
17b00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17b10 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
17b20 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
17b30 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17b40 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
17b50 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
17b60 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
17b70 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
17b80 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
17b90 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
17ba0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
17bb0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
17bc0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
17bd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17be0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
17bf0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
17c00 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
17c10 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
17c20 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
17c30 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
17c40 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
17c50 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
17c60 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
17c70 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
17c80 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
17c90 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
17ca0 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
17cb0 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
17cc0 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
17cd0 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
17ce0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
17cf0 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
17d00 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
17d10 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
17d20 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
17d30 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
17d40 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
17d50 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
17d60 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
17d70 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
17d80 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17d90 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
17da0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
17db0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
17dc0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
17dd0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
17de0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
17df0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
17e00 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
17e10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
17e20 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
17e30 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
17e40 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
17e50 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
17e60 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
17e70 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
17e80 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
17e90 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
17ea0 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
17eb0 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
17ec0 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
17ed0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
17ee0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
17ef0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
17f00 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
17f10 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
17f20 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
17f30 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
17f40 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
17f50 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
17f60 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17f70 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
17f80 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
17f90 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
17fa0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
17fb0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
17fc0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
17fd0 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
17fe0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
17ff0 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
18000 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
18010 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
18020 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
18030 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
18040 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
18050 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
18060 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
18070 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
18080 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
18090 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
180a0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
180b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
180c0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
180d0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
180e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
180f0 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
18100 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
18110 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
18120 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
18130 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
18140 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
18150 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
18160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18170 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
18180 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
18190 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
181a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
181b0 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
181c0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
181d0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
181e0 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
181f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18200 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
18210 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
18220 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
18230 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
18240 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
18250 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
18260 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
18270 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
18280 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
18290 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
182a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
182b0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
182c0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
182d0 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
182e0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
182f0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
18300 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
18310 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
18320 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
18330 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
18340 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
18350 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
18360 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
18370 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
18380 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
18390 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
183a0 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
183b0 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
183c0 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
183d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
183e0 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
183f0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
18400 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
18410 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
18420 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
18430 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
18440 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
18450 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
18460 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
18470 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
18480 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
18490 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
184a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
184b0 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
184c0 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
184d0 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
184e0 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
184f0 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
18500 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
18510 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
18520 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
18530 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
18540 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
18550 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
18560 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
18570 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
18580 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
18590 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
185a0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
185b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
185c0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
185d0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
185e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
185f0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
18600 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
18610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
18620 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18630 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
18640 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
18650 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
18660 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18670 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
18680 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
18690 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
186a0 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
186b0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
186c0 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
186d0 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
186e0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
186f0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
18700 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
18710 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
18720 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
18730 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
18740 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
18750 3e 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61  >pIBIndex ) brea
18760 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
18770 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
18780 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
18790 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64  ALTABLE./*.** Ad
187a0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
187b0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
187c0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
187d0 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
187e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
187f0 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
18800 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
18810 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
18820 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
18830 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45   there are no LE
18840 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
18850 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75   joins in the qu
18860 65 72 79 2c 20 62 6f 74 68 20 6d 45 78 74 72 61  ery, both mExtra
18870 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
18880 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
18890 4f 74 68 65 72 77 69 73 65 2c 20 6d 45 78 74 72  Otherwise, mExtr
188a0 61 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61  a is a mask of a
188b0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  ll FROM clause.*
188c0 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  * entries that o
188d0 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
188e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
188f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18900 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61   and are.** sepa
18910 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79  rated from it by
18920 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45   at least one LE
18930 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
18940 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
18950 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61  .** mUnusable ma
18960 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  sk contains all 
18970 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
18980 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61  ies that occur a
18990 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74  fter the.** virt
189a0 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72  ual table and ar
189b0 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  e separated from
189c0 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
189d0 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20  one LEFT or .** 
189e0 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a  CROSS JOIN. .**.
189f0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
18a00 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72  if the query wer
18a10 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  e:.**.**   ... F
18a20 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20  ROM t1, t2 LEFT 
18a30 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20  JOIN t3, t4, vt 
18a40 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74  CROSS JOIN t5, t
18a50 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45  6;.**.** then mE
18a60 78 74 72 61 20 63 6f 72 72 65 73 70 6f 6e 64 73  xtra corresponds
18a70 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64   to (t1, t2) and
18a80 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74   mUnusable to (t
18a90 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c  5, t6)..**.** Al
18aa0 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  l the tables in 
18ab0 6d 45 78 74 72 61 20 6d 75 73 74 20 62 65 20 73  mExtra must be s
18ac0 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68  canned before th
18ad0 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61  e current virtua
18ae0 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20  l .** table. So 
18af0 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68  any terms for wh
18b00 69 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69  ich all prerequi
18b10 73 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66  sites are satisf
18b20 69 65 64 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72  ied by .** mExtr
18b30 61 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  a may be specifi
18b40 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
18b50 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
18b60 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
18b70 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
18b80 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
18b90 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
18ba0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
18bb0 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
18bc0 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
18bd0 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
18be0 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
18bf0 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
18c00 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
18c10 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
18c20 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
18c30 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
18c40 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
18c50 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
18c60 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
18c70 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
18c80 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
18c90 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
18ca0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
18cb0 20 6d 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   mExtra,        
18cc0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
18cd0 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
18ce0 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
18cf0 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
18d00 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
18d10 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
18d20 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
18d30 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
18d40 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   one */.){.  Whe
18d50 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
18d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
18d70 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
18d80 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
18d90 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
18da0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
18db0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18dc0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18dd0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
18de0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
18df0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
18e00 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
18e10 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
18e20 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
18e30 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
18e40 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
18e50 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
18e60 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
18e70 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
18e80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
18e90 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
18ea0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
18eb0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
18ec0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
18ed0 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
18ee0 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
18ef0 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
18f00 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
18f10 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
18f20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f40 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
18f50 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
18f60 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
18f70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18f80 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
18f90 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
18fa0 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
18fb0 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
18fe0 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
18ff0 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
19000 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
19010 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
19020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
19030 73 65 72 74 28 20 28 6d 45 78 74 72 61 20 26 20  sert( (mExtra & 
19040 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b  mUnusable)==0 );
19050 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
19060 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
19070 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
19080 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
19090 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
190a0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
190b0 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
190c0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
190d0 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
190e0 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
190f0 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
19100 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
19110 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
19120 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
19130 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
19140 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
19150 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20  pWC, mUnusable, 
19160 70 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70  pSrc,pBuilder->p
19170 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
19180 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
19190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
191a0 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
191b0 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
191c0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
191d0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
191e0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
191f0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
19200 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
19210 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
19220 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
19230 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
19240 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
19250 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
19260 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
19270 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
19280 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
19290 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
192a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
192b0 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
192c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
192d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
192e0 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
192f0 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
19300 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
19310 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
19320 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
19330 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
19340 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
19350 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
19360 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
19370 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
19380 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
19390 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
193a0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
193b0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
193c0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
193d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
193e0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
193f0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
19400 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
19410 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
19420 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
19430 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
19440 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
19450 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
19460 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
19470 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
19480 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
19490 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
194a0 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
194b0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
194c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
194d0 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
194e0 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
194f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
19500 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
19510 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
19520 68 74 20 26 20 7e 6d 45 78 74 72 61 29 21 3d 30  ht & ~mExtra)!=0
19530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19540 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
19550 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
19560 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
19570 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  or & WO_IN)==0 )
19580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
19590 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
195a0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
195b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
195c0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
195d0 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
195e0 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
195f0 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
19600 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
19610 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
19620 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
19630 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
19640 68 74 20 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30  ht & ~mExtra)==0
19650 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
19660 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
19670 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
19680 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
19690 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
196a0 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
196b0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
196c0 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
196d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
196e0 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
196f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19700 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
19710 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
19720 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
19730 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
19740 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
19750 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
19760 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
19770 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19790 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
197a0 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
197b0 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
197c0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
197d0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
197e0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
197f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
19800 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
19810 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
19820 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
19830 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
19840 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
19850 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
19860 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
19870 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
19880 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
19890 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
198a0 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
198b0 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
198c0 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e  le)2;.    pIdxIn
198d0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
198e0 73 20 3d 20 32 35 3b 0a 20 20 20 20 70 49 64 78  s = 25;.    pIdx
198f0 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d  Info->idxFlags =
19900 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61   0;.    rc = vta
19910 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
19920 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
19930 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
19940 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
19950 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
19960 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
19970 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
19980 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
19990 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
199a0 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
199b0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
199c0 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  a;.    mxTerm = 
199d0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
199e0 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
199f0 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20  onstraint );.   
19a00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
19a10 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
19a20 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
19a30 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  0;.    pNew->u.v
19a40 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
19a50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19a60 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
19a70 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
19a80 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
19a90 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
19aa0 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
19ab0 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
19ac0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
19ad0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
19ae0 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
19af0 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  int.         || 
19b00 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  j<0.         || 
19b10 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
19b20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
19b30 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
19b40 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
19b50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19b60 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
19b70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19b80 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78  sg(pParse, "%s.x
19b90 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66  BestIndex() malf
19ba0 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e  unction", pTab->
19bb0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
19bc0 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
19bd0 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
19be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19bf0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
19c00 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
19c10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19c20 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
19c30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
19c40 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
19c50 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
19c60 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
19c70 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
19c80 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
19c90 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
19ca0 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
19cb0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
19cc0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
19cd0 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65  erm[iTerm] = pTe
19ce0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
19cf0 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
19d00 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
19d10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19d20 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
19d30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19d40 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
19d50 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
19d60 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
19d70 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
19d80 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
19d90 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  <<iTerm;.       
19da0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
19db0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
19dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
19dd0 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
19de0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
19df0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
19e00 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
19e10 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
19e20 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
19e30 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
19e40 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
19e50 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
19e60 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
19e70 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
19e80 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
19e90 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
19ea0 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
19eb0 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
19ec0 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
19ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
19ee0 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
19ef0 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
19f00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19f20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
19f30 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
19f40 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
19f50 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
19f60 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
19f70 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
19f80 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
19f90 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
19fa0 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
19fb0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
19fc0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
19fd0 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
19fe0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
19ff0 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
1a000 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
1a010 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
1a020 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
1a030 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
1a040 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
1a050 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
1a060 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
1a070 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
1a080 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  0;.          pId
1a090 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1a0a0 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58  &= ~SQLITE_INDEX
1a0b0 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20  _SCAN_UNIQUE;.  
1a0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a0d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
1a0e0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
1a0f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
1a100 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
1a110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
1a120 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
1a130 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
1a140 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1a150 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
1a160 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
1a170 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1a180 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
1a190 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1a1a0 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
1a1b0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1a1c0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
1a1d0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
1a1e0 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
1a1f0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
1a200 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
1a210 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
1a220 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1a230 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20  umed ?.         
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
1a260 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
1a270 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  : 0);.      pNew
1a280 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1a290 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1a2a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
1a2b0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
1a2c0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1a2d0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
1a2e0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
1a2f0 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
1a300 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20  timatedRows);.. 
1a310 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1a320 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61  WHERE_ONEROW fla
1a330 67 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e  g if the xBestIn
1a340 64 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64  dex() method ind
1a350 69 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  icated.      ** 
1a360 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
1a370 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73 74  ll visit at most
1a380 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72 20   one row. Clear 
1a390 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f  it otherwise. */
1a3a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 49  .      if( pIdxI
1a3b0 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20  nfo->idxFlags & 
1a3c0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1a3d0 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  N_UNIQUE ){.    
1a3e0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1a3f0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
1a400 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
1a410 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
1a420 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
1a430 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a  ONEROW;.      }.
1a440 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49        whereLoopI
1a450 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1a460 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
1a470 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
1a480 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
1a490 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a4a0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
1a4b0 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  tr);.        pNe
1a4c0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
1a4d0 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ee = 0;.      }.
1a4e0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65      }.  }  ..whe
1a4f0 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
1a500 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e  it:.  if( pIdxIn
1a510 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1a520 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
1a530 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
1a540 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
1a550 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
1a560 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  nfo);.  return r
1a570 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
1a580 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1a590 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
1a5a0 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
1a5b0 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
1a5c0 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
1a5d0 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
1a5e0 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
1a5f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
1a600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1a610 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20  ereLoopAddOr(.  
1a620 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1a630 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42   *pBuilder, .  B
1a640 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20 0a  itmask mExtra, .
1a650 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61    Bitmask mUnusa
1a660 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e  ble.){.  WhereIn
1a670 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1a680 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1a690 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1a6a0 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  C;.  WhereLoop *
1a6b0 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72  pNew;.  WhereTer
1a6c0 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e  m *pTerm, *pWCEn
1a6d0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1a6e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
1a6f0 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
1a700 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65  se tempWC;.  Whe
1a710 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53  reLoopBuilder sS
1a720 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65  ubBuild;.  Where
1a730 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72  OrSet sSum, sCur
1a740 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1a750 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a760 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c    .  pWC = pBuil
1a770 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45  der->pWC;.  pWCE
1a780 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
1a790 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
1a7a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1a7b0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75  w;.  memset(&sSu
1a7c0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75  m, 0, sizeof(sSu
1a7d0 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  m));.  pItem = p
1a7e0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1a7f0 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
1a800 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
1a810 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72  >iCursor;..  for
1a820 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
1a830 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
1a840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
1a850 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
1a860 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1a870 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
1a880 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
1a890 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
1a8a0 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
1a8b0 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
1a8c0 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
1a8d0 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
1a8e0 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
1a8f0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
1a900 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
1a910 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
1a920 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
1a930 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
1a940 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
1a950 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20       int once = 
1a960 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  1;.      int i, 
1a970 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53  j;.    .      sS
1a980 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
1a990 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42  der;.      sSubB
1a9a0 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20  uild.pOrderBy = 
1a9b0 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  0;.      sSubBui
1a9c0 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75  ld.pOrSet = &sCu
1a9d0 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54  r;..      WHERET
1a9e0 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65  RACE(0x200, ("Be
1a9f0 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f  gin processing O
1aa00 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20  R-clause %p\n", 
1aa10 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66  pTerm));.      f
1aa20 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
1aa30 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
1aa40 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
1aa50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
1aa60 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1aa70 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
1aa80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1aa90 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f  bBuild.pWC = &pO
1aaa0 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
1aab0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d  o->wc;.        }
1aac0 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
1aad0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1aae0 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
1aaf0 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20  tempWC.pWInfo = 
1ab00 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20  pWC->pWInfo;.   
1ab10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
1ab20 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
1ab30 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
1ab40 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
1ab50 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
1ab60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1ab70 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
1ab80 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  rm;.          sS
1ab90 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74  ubBuild.pWC = &t
1aba0 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d  empWC;.        }
1abb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1abc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1abd0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72    }.        sCur
1abe0 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57  .n = 0;.#ifdef W
1abf0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
1ac00 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  D.        WHERET
1ac10 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52  RACE(0x200, ("OR
1ac20 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68  -term %d of %p h
1ac30 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c  as %d subterms:\
1ac40 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
1ac50 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f          (int)(pO
1ac60 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c  rTerm-pOrWC->a),
1ac70 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c   pTerm, sSubBuil
1ac80 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a  d.pWC->nTerm));.
1ac90 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1aca0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
1acb0 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x400 ){.       
1acc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53     for(i=0; i<sS
1acd0 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
1ace0 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
1acf0 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50        whereTermP
1ad00 72 69 6e 74 28 26 73 53 75 62 42 75 69 6c 64 2e  rint(&sSubBuild.
1ad10 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20  pWC->a[i], i);. 
1ad20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ad30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e     }.#endif.#ifn
1ad40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ad50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1ad60 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
1ad70 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
1ad80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1ad90 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1ada0 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
1adb0 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61  , mExtra, mUnusa
1adc0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ble);.        }e
1add0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1ade0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
1adf0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1ae00 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
1ae10 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
1ae20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1ae30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ae40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ae50 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1ae60 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
1ae70 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  ra, mUnusable);.
1ae80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ae90 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1aea0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
1aeb0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
1aec0 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
1aed0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
1aee0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1aef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1af00 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
1af10 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
1af20 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
1af30 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
1af40 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
1af50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1af60 20 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73      WhereOrSet s
1af70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
1af80 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
1af90 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
1afa0 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
1afb0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1afc0 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
1afd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1afe0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
1aff0 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
1b000 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
1b010 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
1b020 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
1b030 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
1b040 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1b070 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
1b080 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
1b090 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b0b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1b0c0 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
1b0d0 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
1b0e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1b0f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b110 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
1b120 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
1b130 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
1b140 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
1b150 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1b160 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
1b170 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1b180 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
1b190 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
1b1a0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
1b1b0 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
1b1c0 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
1b1d0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
1b1e0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
1b1f0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
1b200 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72    /* TUNING: Cur
1b210 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d  rently sSum.a[i]
1b220 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20  .rRun is set to 
1b230 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63  the sum of the c
1b240 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  osts.        ** 
1b250 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73  of all sub-scans
1b260 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1b270 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65   OR-scan. Howeve
1b280 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69  r, due to roundi
1b290 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  ng.        ** er
1b2a0 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20  rors, it may be 
1b2b0 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
1b2c0 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20   the OR-scan is 
1b2d0 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20  equal to its.   
1b2e0 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70       ** most exp
1b2f0 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e  ensive sub-scan.
1b300 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73   Add the smalles
1b310 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c  t possible penal
1b320 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ty .        ** (
1b330 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75  equivalent to mu
1b340 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f  ltiplying the co
1b350 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65  st by 1.07) to e
1b360 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20  nsure that .    
1b370 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73      ** this does
1b380 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68   not happen. Oth
1b390 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52  erwise, for WHER
1b3a0 45 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61  E clauses such a
1b3b0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1b3c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65   following where
1b3d0 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
1b3e0 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20  ex on "y":.     
1b3f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1b400 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c       WHERE likel
1b410 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29  ihood(x=?, 0.99)
1b420 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20   OR y=?.        
1b430 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
1b440 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c  e planner may el
1b450 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65  ect to "OR" toge
1b460 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c  ther a full-tabl
1b470 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20  e scan and an.  
1b480 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c        ** index l
1b490 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72  ookup. And other
1b4a0 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72   similarly odd r
1b4b0 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
1b4c0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1b4d0 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
1b4e0 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  + 1;.        pNe
1b4f0 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
1b500 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
1b510 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
1b520 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
1b530 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
1b540 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
1b550 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
1b560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
1b570 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
1b580 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e   ("End processin
1b590 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1b5a0 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1b5b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b5c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
1b5d0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
1b5e0 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
1b5f0 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
1b600 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1b610 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
1b620 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
1b630 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1b640 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1b650 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
1b660 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20  sk mExtra = 0;. 
1b670 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
1b680 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
1b690 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1b6a0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
1b6b0 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
1b6c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1b6d0 70 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20  pItem;.  struct 
1b6e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45  SrcList_item *pE
1b6f0 6e 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  nd = &pTabList->
1b700 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
1b710 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ];.  sqlite3 *db
1b720 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1b730 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  e->db;.  int rc 
1b740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57  = SQLITE_OK;.  W
1b750 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
1b760 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79    u8 priorJointy
1b770 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f  pe = 0;..  /* Lo
1b780 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
1b790 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
1b7a0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1b7b0 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
1b7c0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1b7d0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
1b7e0 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  New);.  for(iTab
1b7f0 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
1b800 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e  st->a; pItem<pEn
1b810 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  d; iTab++, pItem
1b820 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ++){.    Bitmask
1b830 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a   mUnusable = 0;.
1b840 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
1b850 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
1b860 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69  >maskSelf = sqli
1b870 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1b880 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
1b890 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
1b8a0 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49  r);.    if( ((pI
1b8b0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
1b8c0 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20  |priorJointype) 
1b8d0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
1b8e0 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
1b8f0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74    /* This condit
1b900 69 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e  ion is true when
1b910 20 70 49 74 65 6d 20 69 73 20 74 68 65 20 46 52   pItem is the FR
1b920 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f  OM clause term o
1b930 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  n the.      ** r
1b940 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  ight-hand-side o
1b950 66 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53  f a LEFT or CROS
1b960 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20  S JOIN.  */.    
1b970 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
1b980 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
1b990 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74  orJointype = pIt
1b9a0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
1b9b0 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
1b9c0 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
1b9d0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1b9e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b  SrcList_item *p;
1b9f0 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49  .      for(p=&pI
1ba00 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20  tem[1]; p<pEnd; 
1ba10 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
1ba20 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28  ( mUnusable || (
1ba30 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  p->fg.jointype &
1ba40 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
1ba50 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  SS)) ){.        
1ba60 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73    mUnusable |= s
1ba70 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1ba80 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1ba90 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72  kSet, p->iCursor
1baa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bab0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1bac0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1bad0 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ual(pBuilder, mE
1bae0 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29  xtra, mUnusable)
1baf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bb00 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1bb10 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64  pAddBtree(pBuild
1bb20 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
1bb30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1bb40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bb50 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1bb60 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20  AddOr(pBuilder, 
1bb70 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c  mExtra, mUnusabl
1bb80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  e);.    }.    mP
1bb90 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
1bba0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
1bbb0 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
1bbc0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
1bbd0 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70    }..  whereLoop
1bbe0 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b  Clear(db, pNew);
1bbf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bc00 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
1bc10 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68   WherePath (with
1bc20 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
1bc30 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65   the extra Where
1bc40 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a  Loop of the 5th.
1bc50 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74  ** parameters) t
1bc60 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70  o see if it outp
1bc70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20  uts rows in the 
1bc80 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20  requested ORDER 
1bc90 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20  BY.** (or GROUP 
1bca0 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75  BY) without requ
1bcb0 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65  iring a separate
1bcc0 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e   sort operation.
1bcd0 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a    Return N:.** .
1bce0 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65  **   N>0:   N te
1bcf0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1bd00 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
1bd10 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d  atisfied.**   N=
1bd20 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66  =0:  No terms of
1bd30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bd40 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
1bd50 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55  ed.**   N<0:   U
1bd60 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d  nknown yet how m
1bd70 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44  any terms of ORD
1bd80 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20 73  ER BY might be s
1bd90 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a  atisfied.   .**.
1bda0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f  ** Note that pro
1bdb0 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52  cessing for WHER
1bdc0 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48  E_GROUPBY and WH
1bdd0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69  ERE_DISTINCTBY i
1bde0 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69  s not as.** stri
1bdf0 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20  ct.  With GROUP 
1be00 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
1be10 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65  the only require
1be20 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20  ment is that.** 
1be30 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
1be40 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65  appear immediate
1be50 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f  ly adjacent to o
1be60 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f  ne another.  GRO
1be70 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53  UP BY.** and DIS
1be80 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71  TINCT do not req
1be90 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70  uire rows to app
1bea0 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69  ear in any parti
1beb0 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c  cular order as l
1bec0 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 61  ong.** as equiva
1bed0 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72  lent rows are gr
1bee0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20  ouped together. 
1bef0 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20   Thus for GROUP 
1bf00 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a  BY and DISTINCT.
1bf10 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  ** the pOrderBy 
1bf20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74  terms can be mat
1bf30 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65  ched in any orde
1bf40 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42  r.  With ORDER B
1bf50 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65  Y, the .** pOrde
1bf60 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62  rBy terms must b
1bf70 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72  e matched in str
1bf80 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68  ict left-to-righ
1bf90 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  t order..*/.stat
1bfa0 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68 53  ic i8 wherePathS
1bfb0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
1bfc0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1bfd0 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20  Info,    /* The 
1bfe0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1bff0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1c000 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52  erBy,   /* ORDER
1c010 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
1c020 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75  or DISTINCT clau
1c030 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  se to check */. 
1c040 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74   WherePath *pPat
1c050 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  h,     /* The Wh
1c060 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b  erePath to check
1c070 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
1c080 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d  lags,       /* M
1c090 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45  ight contain WHE
1c0a0 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48  RE_GROUPBY or WH
1c0b0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a  ERE_DISTINCTBY *
1c0c0 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20  /.  u16 nLoop,  
1c0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c0e0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1c0f0 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
1c100 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1c110 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pLast,     /* A
1c120 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  dd this WhereLoo
1c130 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
1c140 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
1c150 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65  /.  Bitmask *pRe
1c160 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54  vMask     /* OUT
1c170 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  : Mask of WhereL
1c180 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
1c190 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
1c1a0 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
1c1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c1c0 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
1c1d0 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c1f0 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
1c200 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
1c210 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
1c220 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
1c230 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
1c240 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20  rderDistinct;   
1c250 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65  /* All prior Whe
1c260 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65  reLoops are orde
1c270 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  r-distinct */.  
1c280 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  u8 distinctColum
1c290 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ns;   /* True if
1c2a0 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e   the loop has UN
1c2b0 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  IQUE NOT NULL co
1c2c0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73  lumns */.  u8 is
1c2d0 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
1c2e0 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63   /* iColumn matc
1c2f0 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  hes a term of th
1c300 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c310 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43  e */.  u16 nKeyC
1c320 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol;          /* 
1c330 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f  Number of key co
1c340 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20  lumns in pIndex 
1c350 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e  */.  u16 nColumn
1c360 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1c370 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72  tal number of or
1c380 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e  dered columns in
1c390 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1c3a0 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
1c3b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c3c0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
1c3d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1c3e0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
1c3f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1c400 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
1c410 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
1c420 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
1c430 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1c440 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1c450 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1c460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c470 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
1c480 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
1c490 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
1c4a0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
1c4b0 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
1c4c0 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
1c4d0 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
1c4e0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20  oop *pLoop = 0; 
1c4f0 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
1c500 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
1c510 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
1c520 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1c530 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
1c540 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
1c550 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
1c560 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
1c570 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
1c580 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
1c590 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1c5a0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1c5b0 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
1c5c0 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
1c5d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1c5e0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
1c5f0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1c600 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
1c610 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1c620 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
1c630 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
1c640 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
1c650 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1c660 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
1c670 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
1c680 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
1c690 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
1c6a0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
1c6b0 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
1c6c0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1c6d0 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
1c6e0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
1c6f0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1c700 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
1c710 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
1c720 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
1c730 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
1c740 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1c750 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
1c760 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
1c770 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
1c780 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
1c790 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
1c7a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
1c7b0 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
1c7c0 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
1c7d0 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
1c7e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1c7f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
1c800 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
1c810 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
1c820 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
1c830 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
1c840 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
1c850 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
1c860 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
1c870 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
1c880 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
1c890 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
1c8a0 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
1c8b0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
1c8c0 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
1c8d0 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
1c8e0 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
1c8f0 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
1c900 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
1c910 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
1c920 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
1c930 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
1c940 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
1c950 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
1c960 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c970 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
1c980 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
1c990 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
1c9a0 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
1c9b0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
1c9c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
1c9d0 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
1c9e0 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
1c9f0 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
1ca00 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
1ca10 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
1ca20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
1ca30 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
1ca40 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
1ca50 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
1ca60 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
1ca70 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
1ca80 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
1ca90 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
1caa0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
1cab0 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
1cac0 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
1cad0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
1cae0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
1caf0 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
1cb00 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
1cb10 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
1cb20 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
1cb30 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
1cb40 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
1cb50 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
1cb60 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
1cb70 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
1cb80 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
1cb90 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
1cba0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
1cbb0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1cbc0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1cbd0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
1cbe0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
1cbf0 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
1cc00 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
1cc10 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
1cc20 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
1cc30 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
1cc40 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
1cc50 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
1cc60 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
1cc70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1cc80 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73  By->nExpr;.  tes
1cc90 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d  tcase( nOrderBy=
1cca0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
1ccb0 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29  nOrderBy>BMS-1 )
1ccc0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1ccd0 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f  annot optimize o
1cce0 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45  verly large ORDE
1ccf0 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64  R BYs */.  isOrd
1cd00 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
1cd10 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42    obDone = MASKB
1cd20 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a  IT(nOrderBy)-1;.
1cd30 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
1cd40 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79  ask = 0;.  ready
1cd50 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f   = 0;.  for(iLoo
1cd60 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74  p=0; isOrderDist
1cd70 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62  inct && obSat<ob
1cd80 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e  Done && iLoop<=n
1cd90 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
1cda0 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20      if( iLoop>0 
1cdb0 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70  ) ready |= pLoop
1cdc0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
1cdd0 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c  pLoop = iLoop<nL
1cde0 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f  oop ? pPath->aLo
1cdf0 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73  op[iLoop] : pLas
1ce00 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  t;.    if( pLoop
1ce10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1ce20 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
1ce30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
1ce40 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  p->u.vtab.isOrde
1ce50 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62  red ) obSat = ob
1ce60 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61  Done;.      brea
1ce70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75  k;.    }.    iCu
1ce80 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
1ce90 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
1cea0 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20  Tab].iCursor;.. 
1ceb0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
1cec0 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ny ORDER BY term
1ced0 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c   X that is a col
1cee0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
1cef0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
1cf00 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20  urrent loop for 
1cf10 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74  which there is t
1cf20 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
1cf30 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f  .    ** clause o
1cf40 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20  f the form X IS 
1cf50 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74  NULL or X=? that
1cf60 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
1cf70 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f  outer.    ** loo
1cf80 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ps..    */.    f
1cf90 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1cfa0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1cfb0 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
1cfc0 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
1cfd0 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72  e;.      pOBExpr
1cfe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1cff0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
1d000 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1d010 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1d020 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1d030 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
1d040 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1d050 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
1d060 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d070 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
1d080 68 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57  hereFindTerm(&pW
1d090 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c  Info->sWC, iCur,
1d0a0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
1d0b0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
1d0c0 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79            ~ready
1d0d0 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c  , WO_EQ|WO_ISNUL
1d0e0 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 20  L|WO_IS, 0);.   
1d0f0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
1d100 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d110 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1d120 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57  perator&(WO_EQ|W
1d130 4f 5f 49 53 29 29 21 3d 30 20 26 26 20 70 4f 42  O_IS))!=0 && pOB
1d140 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
1d150 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1d160 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b  t char *z1, *z2;
1d170 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1d180 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1d190 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
1d1a0 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
1d1b0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1d1c0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1d1d0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1d1e0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
1d1f0 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  1 = pColl->zName
1d200 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
1d210 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1d220 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
1d230 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
1d240 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1d250 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1d260 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
1d270 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f          z2 = pCo
1d280 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
1d290 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1d2a0 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30  rICmp(z1, z2)!=0
1d2b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d2c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d2d0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Term->pExpr->op=
1d2e0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
1d2f0 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d  }.      obSat |=
1d300 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1d310 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   }..    if( (pLo
1d320 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d330 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29  ERE_ONEROW)==0 )
1d340 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
1d350 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d360 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  RE_IPK ){.      
1d370 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1d380 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
1d390 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  0;.        nColu
1d3a0 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  mn = 1;.      }e
1d3b0 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20  lse if( (pIndex 
1d3c0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1d3d0 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70  .pIndex)==0 || p
1d3e0 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
1d3f0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
1d400 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
1d410 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  se{.        nKey
1d420 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b  Col = pIndex->nK
1d430 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e  eyCol;.        n
1d440 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
1d450 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
1d460 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
1d470 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20  n==nKeyCol+1 || 
1d480 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
1d490 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  ->pTable) );.   
1d4a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
1d4b0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
1d4c0 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57  olumn-1]==XN_ROW
1d4d0 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ID.             
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1d4f0 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
1d500 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  ->pTable));.    
1d510 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1d520 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e  nct = IsUniqueIn
1d530 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  dex(pIndex);.   
1d540 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
1d550 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
1d560 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1d570 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
1d580 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
1d590 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
1d5a0 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
1d5b0 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
1d5c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
1d5d0 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
1d5e0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
1d5f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
1d600 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
1d610 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
1d620 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
1d630 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
1d640 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
1d650 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
1d660 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
1d670 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
1d680 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1d690 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
1d6a0 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
1d6b0 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30   pLoop->nSkip==0
1d6c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
1d6d0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1d6e0 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
1d6f0 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
1d700 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20  LL|WO_IS))!=0.  
1d710 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1d720 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
1d730 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
1d740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
1d750 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
1d760 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1d770 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1d780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d790 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1d7a0 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
1d7b0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
1d7c0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
1d7d0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
1d7e0 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
1d7f0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
1d800 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
1d810 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
1d820 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1d830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1d840 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
1d850 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
1d860 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1d870 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
1d880 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
1d890 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
1d8a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
1d8b0 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
1d8c0 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
1d8d0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
1d8e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d8f0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
1d900 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  XN_ROWID;.      
1d910 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
1d920 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1d930 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
1d940 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
1d950 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
1d960 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
1d970 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
1d980 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
1d990 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
1d9a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1d9b0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1d9c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
1d9d0 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
1d9e0 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
1d9f0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
1da00 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
1da10 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
1da20 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
1da30 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1da40 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1da50 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
1da60 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
1da70 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
1da80 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
1da90 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
1daa0 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
1dab0 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
1dac0 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
1dad0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
1dae0 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
1daf0 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b        bOnce = 1;
1db00 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68  .        isMatch
1db10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1db20 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20  r(i=0; bOnce && 
1db30 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
1db40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1db50 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
1db60 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
1db70 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
1db80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1db90 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
1dba0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1dbb0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1dbc0 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
1dbd0 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
1dbe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
1dbf0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
1dc00 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
1dc10 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  CTBY );.        
1dc20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
1dc30 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50  s & (WHERE_GROUP
1dc40 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  BY|WHERE_DISTINC
1dc50 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65  TBY))==0 ) bOnce
1dc60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1dc70 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 28 2d 31  if( iColumn>=(-1
1dc80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1dc90 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
1dca0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
1dcb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1dcc0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1dcd0 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
1dce0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1dcf0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
1dd00 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
1dd10 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
1dd20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1dd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1dd40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1dd50 61 72 65 28 70 4f 42 45 78 70 72 2c 70 49 6e 64  are(pOBExpr,pInd
1dd60 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b  ex->aColExpr->a[
1dd70 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 29 20 29  j].pExpr,iCur) )
1dd80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dd90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1dda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ddb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1ddc0 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ( iColumn>=0 ){.
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1dde0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1ddf0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1de00 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1de10 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1de20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1de30 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1de40 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1de50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1de60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
1de70 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
1de80 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
1de90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1dea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1deb0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a     isMatch = 1;.
1dec0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1ded0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dee0 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26     if( isMatch &
1def0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
1df00 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d  WHERE_GROUPBY)==
1df10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1df20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1df30 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f  sort order is co
1df40 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f  mpatible in an O
1df50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
1df60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
1df70 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
1df80 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
1df90 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
1dfa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
1dfb0 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
1dfc0 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
1dfd0 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
1dfe0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1dff0 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a   ) isMatch = 0;.
1e000 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e010 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
1e020 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64   = revIdx ^ pOrd
1e030 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
1e040 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rder;.          
1e050 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65    if( rev ) *pRe
1e060 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  vMask |= MASKBIT
1e070 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  (iLoop);.       
1e080 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
1e090 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e0b0 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20  f( isMatch ){.  
1e0c0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
1e0d0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
1e0e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
1e0f0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
1e100 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
1e110 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1e120 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1e130 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
1e140 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
1e150 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
1e170 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
1e180 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
1e190 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29  0 || j<nKeyCol )
1e1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
1e1b0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
1e1c0 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
1e1d0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
1e1e0 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
1e1f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e210 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
1e220 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
1e230 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
1e240 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
1e250 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
1e260 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e270 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
1e280 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
1e290 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1e2a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1e2b0 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
1e2c0 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
1e2d0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
1e2e0 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
1e2f0 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
1e300 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
1e310 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
1e320 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
1e330 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1e340 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
1e350 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
1e360 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
1e370 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
1e380 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
1e390 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20  Bitmask mTerm;. 
1e3a0 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
1e3b0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
1e3c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e3d0 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
1e3e0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1e3f0 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69      mTerm = sqli
1e400 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
1e410 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
1e420 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
1e430 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
1e440 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
1e450 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
1e460 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e470 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
1e480 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
1e490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
1e4a0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
1e4b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e4c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
1e4d0 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
1e4e0 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
1e4f0 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
1e500 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
1e510 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
1e520 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
1e530 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
1e540 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
1e550 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1e560 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
1e570 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1e580 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
1e590 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
1e5a0 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
1e5b0 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
1e5c0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
1e5d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1e5e0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
1e5f0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
1e600 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
1e610 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
1e620 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1e630 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
1e640 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
1e650 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
1e660 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
1e670 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
1e680 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
1e690 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
1e6a0 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
1e6b0 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
1e6c0 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
1e6d0 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
1e6e0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1e6f0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
1e700 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1e710 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
1e720 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
1e730 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1e740 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
1e750 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
1e760 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
1e770 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
1e780 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
1e790 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
1e7a0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
1e7b0 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
1e7c0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
1e7d0 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
1e7e0 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
1e7f0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1e800 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
1e810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
1e820 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
1e830 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
1e840 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
1e850 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
1e860 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
1e870 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
1e880 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
1e890 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
1e8a0 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
1e8b0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
1e8c0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
1e8d0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
1e8e0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
1e8f0 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
1e900 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
1e910 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
1e920 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
1e930 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
1e940 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
1e950 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
1e960 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
1e970 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
1e980 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
1e990 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
1e9a0 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
1e9b0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
1e9c0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
1e9d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1e9e0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
1e9f0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
1ea00 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1ea10 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
1ea20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1ea30 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
1ea40 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1ea50 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
1ea60 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
1ea70 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1ea80 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
1ea90 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
1eaa0 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
1eab0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
1eac0 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
1ead0 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
1eae0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1eaf0 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
1eb00 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
1eb10 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
1eb20 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
1eb30 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
1eb40 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
1eb50 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
1eb60 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
1eb70 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1eb80 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
1eb90 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
1eba0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
1ebb0 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
1ebc0 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
1ebd0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
1ebe0 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
1ebf0 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
1ec00 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
1ec10 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
1ec20 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
1ec30 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1ec40 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
1ec50 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
1ec60 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
1ec70 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
1ec80 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
1ec90 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
1eca0 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
1ecb0 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
1ecc0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
1ecd0 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
1ece0 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
1ecf0 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
1ed00 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
1ed10 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
1ed20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
1ed30 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
1ed40 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
1ed50 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
1ed60 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
1ed70 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
1ed80 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
1ed90 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
1eda0 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
1edb0 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
1edc0 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
1edd0 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
1ede0 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
1edf0 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
1ee00 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
1ee10 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
1ee20 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
1ee30 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
1ee40 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1ee50 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
1ee60 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
1ee70 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
1ee80 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
1ee90 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
1eea0 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
1eeb0 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
1eec0 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29  w + estLog(nRow)
1eed0 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a   + rScale + 16;.
1eee0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68  .  /* TUNING: Th
1eef0 65 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d  e cost of implem
1ef00 65 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20  enting DISTINCT 
1ef10 75 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69  using a B-TREE i
1ef20 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62  s.  ** similar b
1ef30 75 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72  ut with a larger
1ef40 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f   constant of pro
1ef50 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20  portionality. . 
1ef60 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20   ** Multiply by 
1ef70 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61  an additional fa
1ef80 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f  ctor of 3.0.  */
1ef90 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
1efa0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1efb0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
1efc0 29 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74  ){.    rSortCost
1efd0 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72   += 16;.  }..  r
1efe0 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b  eturn rSortCost;
1eff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1f000 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
1f010 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74  eLoop objects at
1f020 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
1f030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1f040 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
1f050 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
1f060 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
1f070 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
1f080 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
1f090 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
1f0a0 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
1f0b0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
1f0c0 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41   fields..**.** A
1f0d0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74  ssume that the t
1f0e0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
1f0f0 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20  utput rows that 
1f100 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
1f110 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62  sorted.** will b
1f120 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68  e nRowEst (in th
1f130 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73  e 10*log2 repres
1f140 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20  entation).  Or, 
1f150 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a  ignore sorting.*
1f160 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45  * costs if nRowE
1f170 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  st==0..**.** Ret
1f180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1f190 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49   success or SQLI
1f1a0 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65  TE_NOMEM of a me
1f1b0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
1f1c0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
1f1d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f1e0 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57  herePathSolver(W
1f1f0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f200 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74  , LogEst nRowEst
1f210 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63  ){.  int mxChoic
1f220 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1f230 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
1f240 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
1f250 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a   paths tracked *
1f260 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20  /.  int nLoop;  
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f280 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
1f290 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
1f2a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1f2c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1f2d0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f2f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1f300 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
1f310 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
1f320 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1f330 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
1f340 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
1f350 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
1f360 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
1f370 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1f380 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20  rs */.  int mxI 
1f390 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f3a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1f3b0 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c  xt entry to repl
1f3c0 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  ace */.  int nOr
1f3d0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
1f3e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f3f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1f400 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  terms */.  LogEs
1f410 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
1f420 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1f430 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
1f440 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45   paths */.  LogE
1f450 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20  st mxUnsorted = 
1f460 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  0;    /* Maximum
1f470 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   unsorted cost o
1f480 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20  f a set of path 
1f490 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46  */.  int nTo, nF
1f4a0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rom;           /
1f4b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
1f4c0 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f  d entries in aTo
1f4d0 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a  [] and aFrom[] *
1f4e0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
1f4f0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
1f500 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73   All nFrom paths
1f510 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73   at the previous
1f520 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
1f530 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20  ePath *aTo;     
1f540 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f        /* The nTo
1f550 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74   best paths at t
1f560 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c  he current level
1f570 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1f580 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *pFrom;         
1f590 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
1f5a0 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65   aFrom[] that we
1f5b0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1f5c0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1f5d0 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pTo;           /
1f5e0 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
1f5f0 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72  aTo[] that we ar
1f600 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
1f610 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c    WhereLoop *pWL
1f620 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  oop;        /* O
1f630 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ne of the WhereL
1f640 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
1f650 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b   WhereLoop **pX;
1f660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1f670 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68  ed to divy up th
1f680 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20  e pSpace memory 
1f690 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f  */.  LogEst *aSo
1f6a0 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f  rtCost = 0;    /
1f6b0 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61  * Sorting and pa
1f6c0 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f  rtial sorting co
1f6d0 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  sts */.  char *p
1f6e0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
1f6f0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
1f700 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
1f710 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
1f720 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20   int nSpace;    
1f730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1f740 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
1f750 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65  ocated at pSpace
1f760 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1f770 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1f780 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1f790 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49  b;.  nLoop = pWI
1f7a0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f  nfo->nLevel;.  /
1f7b0 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69  * TUNING: For si
1f7c0 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e  mple queries, on
1f7d0 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68  ly the best path
1f7e0 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a   is tracked..  *
1f7f0 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e  * For 2-way join
1f800 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61  s, the 5 best pa
1f810 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64  ths are followed
1f820 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73  ..  ** For joins
1f830 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61   of 3 or more ta
1f840 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20  bles, track the 
1f850 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f  10 best paths */
1f860 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e  .  mxChoice = (n
1f870 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28  Loop<=1) ? 1 : (
1f880 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31  nLoop==2 ? 5 : 1
1f890 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  0);.  assert( nL
1f8a0 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61  oop<=pWInfo->pTa
1f8b0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
1f8c0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
1f8d0 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  2, ("---- begin 
1f8e0 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73  solver.  (nRowEs
1f8f0 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73  t=%d)\n", nRowEs
1f900 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52  t));..  /* If nR
1f910 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e  owEst is zero an
1f920 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  d there is an OR
1f930 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
1f940 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69  gnore it. In thi
1f950 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20  s.  ** case the 
1f960 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20  purpose of this 
1f970 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d  call is to estim
1f980 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
1f990 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a  f rows returned.
1f9a0 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72    ** by the over
1f9b0 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20  all query. Once 
1f9c0 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61  this estimate ha
1f9d0 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c  s been obtained,
1f9e0 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
1f9f0 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69   will invoke thi
1fa00 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63  s function a sec
1fa10 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e  ond time, passin
1fa20 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61  g the estimate a
1fa30 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45  s the.  ** nRowE
1fa40 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a  st parameter.  *
1fa50 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
1fa60 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
1fa70 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
1fa80 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
1fa90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64   }else{.    nOrd
1faa0 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  erBy = pWInfo->p
1fab0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
1fac0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
1fad0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
1fae0 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c  e space for aTo,
1faf0 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74   aFrom and aSort
1fb00 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61  Cost[] */.  nSpa
1fb10 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ce = (sizeof(Whe
1fb20 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
1fb30 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
1fb40 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
1fb50 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66  nSpace += sizeof
1fb60 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
1fb70 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  rBy;.  pSpace = 
1fb80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1fb90 61 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  aw(db, nSpace);.
1fba0 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
1fbb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1fbc0 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
1fbd0 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
1fbe0 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
1fbf0 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
1fc00 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
1fc10 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
1fc20 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
1fc30 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
1fc40 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
1fc50 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
1fc60 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
1fc70 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
1fc80 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
1fc90 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
1fca0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65  .  }.  if( nOrde
1fcb0 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
1fcc0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1fcd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
1fce0 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67   it is not being
1fcf0 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70   ignored, set up
1fd00 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  .    ** space fo
1fd10 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b  r the aSortCost[
1fd20 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c  ] array. Each el
1fd30 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f  ement of the aSo
1fd40 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20  rtCost array.   
1fd50 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65   ** is either ze
1fd60 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20  ro - meaning it 
1fd70 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1fd80 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f   initialized - o
1fd90 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  r the.    ** cos
1fda0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
1fdb0 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74  wEst rows of dat
1fdc0 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  a where the firs
1fdd0 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20  t X terms of.   
1fde0 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
1fdf0 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65   clause are alre
1fe00 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68  ady in order, wh
1fe10 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72  ere X is the arr
1fe20 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ay .    ** index
1fe30 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43  .  */.    aSortC
1fe40 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  ost = (LogEst*)p
1fe50 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  X;.    memset(aS
1fe60 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  ortCost, 0, size
1fe70 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
1fe80 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73  derBy);.  }.  as
1fe90 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d  sert( aSortCost=
1fea0 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
1feb0 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61  pace]==(char*)&a
1fec0 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42  SortCost[nOrderB
1fed0 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y] );.  assert( 
1fee0 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20  aSortCost!=0 || 
1fef0 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
1ff00 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20  =(char*)pX );.. 
1ff10 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
1ff20 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
1ff30 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
1ff40 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
1ff50 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
1ff60 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
1ff70 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
1ff80 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
1ff90 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74   above 28.  If t
1ffa0 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
1ffb0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
1ffc0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
1ffd0 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
1ffe0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
1fff0 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  8.  ** rows, the
20000 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
20010 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
20020 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
20030 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
20040 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
20050 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d  8);  assert( 48=
20060 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
20070 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  8) );.  nFrom = 
20080 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72  1;.  assert( aFr
20090 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d  om[0].isOrdered=
200a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  =0 );.  if( nOrd
200b0 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
200c0 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c  f nLoop is zero,
200d0 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
200e0 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e  no FROM terms in
200f0 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63   the query. Sinc
20100 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  e.    ** in this
20110 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
20120 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78  may return a max
20130 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c  imum of one row,
20140 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
20150 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
20160 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
20170 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72   order. Set isOr
20180 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42  dered to nOrderB
20190 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69  y to.    ** indi
201a0 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69  cate this. Or, i
201b0 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74  f nLoop is great
201c0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65  er than zero, se
201d0 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20  t isOrdered to. 
201e0 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61     ** -1, indica
201f0 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ting that the re
20200 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20  sult set may or 
20210 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72  may not be order
20220 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65  ed, .    ** depe
20230 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f  nding on the loo
20240 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ps added to the 
20250 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a  current plan.  *
20260 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  /.    aFrom[0].i
20270 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
20280 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72  >0 ? -1 : nOrder
20290 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  By;.  }..  /* Co
202a0 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
202b0 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
202c0 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
202d0 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
202e0 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
202f0 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
20300 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
20310 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
20320 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
20330 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
20340 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
20350 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
20360 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
20370 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
20380 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
20390 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
203a0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
203b0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
203c0 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
203d0 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
203e0 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
203f0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
20400 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f         LogEst nO
20410 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
20420 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
20430 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72   visited by (pFr
20440 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
20450 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f        LogEst rCo
20460 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
20470 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
20480 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70  of path (pFrom+p
20490 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
204a0 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74    LogEst rUnsort
204b0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
204c0 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
204d0 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70  cost of (pFrom+p
204e0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
204f0 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
20500 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
20510 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64  d;  /* isOrdered
20520 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f   for (pFrom+pWLo
20530 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  op) */.        B
20540 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20  itmask maskNew; 
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20   /* Mask of src 
20570 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20  visited by (..) 
20580 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
20590 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20  sk revMask = 0; 
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205b0 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65  Mask of rev-orde
205c0 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29  r loops for (..)
205d0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28   */..        if(
205e0 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
205f0 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
20600 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
20610 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
20620 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
20630 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
20640 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
20650 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ue;.        /* A
20660 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57  t this point, pW
20670 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64  Loop is a candid
20680 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65  ate to be the ne
20690 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20  xt loop. .      
206a0 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73    ** Compute its
206b0 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20   cost */.       
206c0 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
206d0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57  ite3LogEstAdd(pW
206e0 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
206f0 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
20700 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
20710 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
20720 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
20730 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d  Unsorted, pFrom-
20740 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20  >rUnsorted);.   
20750 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f       nOut = pFro
20760 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70  m->nRow + pWLoop
20770 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ->nOut;.        
20780 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d  maskNew = pFrom-
20790 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
207a0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
207b0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
207c0 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  red<0 ){.       
207d0 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77     isOrdered = w
207e0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
207f0 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
20800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20810 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
20820 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
20830 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
20840 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
20850 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f              iLoo
20860 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d  p, pWLoop, &revM
20870 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ask);.        }e
20880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
20890 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
208a0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
208b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
208c0 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69  sOrdered>=0 && i
208d0 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42  sOrdered<nOrderB
208e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
208f0 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f  f( aSortCost[isO
20900 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20  rdered]==0 ){.  
20910 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
20920 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d  ost[isOrdered] =
20930 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
20940 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t(.             
20950 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45     pWInfo, nRowE
20960 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73  st, nOrderBy, is
20970 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
20980 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
20990 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f   }.          rCo
209a0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
209b0 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
209c0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
209d0 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20  ered]);..       
209e0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
209f0 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  002,.           
20a00 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63     ("---- sort c
20a10 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29  ost=%-3d (%d/%d)
20a20 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
20a30 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a  %3d to %-3d\n",.
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
20a50 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
20a60 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69  ed], (nOrderBy-i
20a70 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65  sOrdered), nOrde
20a80 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
20a90 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20       rUnsorted, 
20aa0 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20  rCost));.       
20ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20ac0 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72    rCost = rUnsor
20ad0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ted;.        }..
20ae0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
20af0 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f   to see if pWLoo
20b00 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65  p should be adde
20b10 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a  d to the set of.
20b20 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f          ** mxCho
20b30 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ice best-so-far 
20b40 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a  paths..        *
20b50 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72  *.        ** Fir
20b60 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  st look for an e
20b70 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f  xisting path amo
20b80 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
20b90 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  aths.        ** 
20ba0 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20  that covers the 
20bb0 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
20bc0 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
20bd0 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  me isOrdered.   
20be0 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20       ** setting 
20bf0 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  as the current p
20c00 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20  ath candidate.. 
20c10 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20c20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28    ** The term "(
20c30 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
20c40 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
20c50 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65  ==0" is equivale
20c60 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  nt.        ** to
20c70 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
20c80 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65  ==(-1))==(isOrde
20c90 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20  red==(-1))" for 
20ca0 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20  the range.      
20cb0 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61    ** of legal va
20cc0 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72  lues for isOrder
20cd0 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20  ed, -1..64..    
20ce0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
20cf0 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
20d00 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
20d10 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
20d20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
20d30 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20  oop==maskNew.   
20d40 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
20d50 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
20d60 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a  dered)&0x80)==0.
20d70 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
20d80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
20d90 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a  e( jj==nTo-1 );.
20da0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
20db0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
20dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20dd0 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
20de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
20df0 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  e of the existin
20e00 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
20e10 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61  ths match the ca
20e20 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20  ndidate. */.    
20e30 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
20e40 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
20e50 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43     && (rCost>mxC
20e60 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d  ost || (rCost==m
20e70 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74  xCost && rUnsort
20e80 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29  ed>=mxUnsorted))
20e90 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
20ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20eb0 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61   current candida
20ec0 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20  te is no better 
20ed0 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  than any of the 
20ee0 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
20ef0 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75       ** paths cu
20f00 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62  rrently in the b
20f10 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65  est-so-far buffe
20f20 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20  r.  So discard. 
20f30 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
20f40 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20  is candidate as 
20f50 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23  not viable. */.#
20f60 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
20f70 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
20f80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
20f90 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
20fa0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
20fb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20fc0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
20fd0 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
20fe0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
20ff0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21000 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
21010 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
21020 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
21030 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
21040 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
21050 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
21060 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
21070 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
21080 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
21090 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
210a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
210b0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
210c0 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
210d0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
210e0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
210f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
21100 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
21110 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
21120 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
21130 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
21140 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
21150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21160 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
21170 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
21180 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
21190 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
211a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
211b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
211c0 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
211d0 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
211e0 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
211f0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
21200 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21210 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
21220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21230 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
21240 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
21250 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
21260 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
21270 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
21280 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
21290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
212a0 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
212b0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
212c0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
212f0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
21300 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
21310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21320 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
21330 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
21340 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
21350 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21370 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
21380 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65  aches here if be
21390 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70  st-so-far path p
213a0 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72  To=aTo[jj] cover
213b0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
213c0 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  ** same set of l
213d0 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
213e0 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73   sam isOrdered s
213f0 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
21400 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
21410 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
21420 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
21430 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
21440 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
21450 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
21460 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
21470 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20  ould be skipped 
21480 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
21490 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73   pTo->rCost<rCos
214a0 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74  t || (pTo->rCost
214b0 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  ==rCost && pTo->
214c0 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23  nRow<=nOut) ){.#
214d0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
214e0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
214f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
21500 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
21510 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
21520 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21530 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
21560 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21570 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
21580 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21590 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
215a0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
215b0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
215c0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
215d0 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
215e0 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21600 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21610 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
21620 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c  -3d,%d order=%c\
21630 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21640 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21650 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21660 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21670 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21690 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
216a0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
216b0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
216c0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
216d0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  if.            /
216e0 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  * Discard the ca
216f0 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72 6f  ndidate path fro
21700 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
21710 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
21720 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21730 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
21740 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
21750 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
21760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21770 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
21780 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
21790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
217a0 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
217b0 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e 64  here if the cand
217c0 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62 65  idate path is be
217d0 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  tter than the.  
217e0 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70          ** pTo p
217f0 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54  ath.  Replace pT
21800 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64 69  o with the candi
21810 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  date. */.#ifdef 
21820 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
21830 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
21840 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21850 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
21860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21870 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21880 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
21890 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
218a0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
218b0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
218c0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
218d0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
218e0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
218f0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
21900 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
21910 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
21920 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
21930 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21940 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
21950 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33   was %s cost=%-3
21960 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
21970 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21980 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
21990 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
219a0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
219b0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
219c0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
219d0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
219e0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
219f0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
21a00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
21a20 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
21a30 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
21a40 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
21a50 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
21a60 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
21a70 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
21a80 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
21a90 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
21aa0 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
21ab0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
21ac0 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
21ad0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
21ae0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
21af0 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
21b00 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  ed = rUnsorted;.
21b10 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
21b20 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
21b30 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
21b40 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
21b50 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
21b60 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
21b70 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
21b80 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
21b90 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
21ba0 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
21bb0 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
21bc0 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
21bd0 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
21be0 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
21bf0 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
21c00 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b  d = aTo[0].nRow;
21c10 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
21c20 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
21c30 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
21c40 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
21c50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
21c60 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a  ->rCost>mxCost .
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
21c80 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
21c90 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73  ost && pTo->rUns
21ca0 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64  orted>mxUnsorted
21cb0 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
21cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21cd0 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
21ce0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
21cf0 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
21d00 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a  pTo->rUnsorted;.
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
21d20 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
21d30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21d40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21d50 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
21d60 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
21d70 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a  BLED  /* >=2 */.
21d80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
21d90 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32  hereTrace & 0x02
21da0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21db0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
21dc0 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
21dd0 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
21de0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
21df0 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
21e00 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
21e10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21e20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
21e30 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
21e40 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
21e50 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
21e60 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
21e70 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
21e80 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
21e90 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
21ea0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
21eb0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
21ec0 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
21ed0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
21ee0 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
21ef0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21f00 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
21f10 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
21f20 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
21f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21f40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
21f50 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
21f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21f70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
21f80 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
21f90 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
21fa0 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
21fb0 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
21fc0 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
21fd0 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
21fe0 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
21ff0 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
22000 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
22010 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
22020 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22030 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
22040 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
22050 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
22060 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
22070 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22080 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
22090 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
220a0 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
220b0 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
220c0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
220d0 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
220e0 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
220f0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
22100 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
22110 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
22120 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
22130 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
22140 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
22150 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
22160 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
22170 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
22180 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
22190 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
221a0 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
221b0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
221c0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
221d0 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
221e0 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
221f0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
22200 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
22210 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
22220 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
22230 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
22240 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
22250 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
22260 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
22270 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
22280 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
22290 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
222a0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
222b0 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
222c0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
222d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
222e0 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
222f0 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
22300 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
22310 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
22320 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
22330 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
22340 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
22350 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
22360 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
22370 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
22380 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
22390 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
223a0 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
223b0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
223c0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
223d0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
223e0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
223f0 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
22400 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
22410 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
22420 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
22430 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
22440 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
22450 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
22460 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22470 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
22480 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
22490 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
224a0 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
224b0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
224c0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
224d0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
224e0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
224f0 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
22500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
22510 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
22520 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
22530 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
22540 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49  ->nOBSat<0 ) pWI
22550 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
22560 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
22570 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
22580 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
22590 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
225a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
225b0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
225c0 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
225d0 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
225e0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
225f0 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
22600 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
22610 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
22620 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
22630 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
22640 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
22650 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
22660 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
22670 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
22680 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
22690 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
226a0 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
226b0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
226c0 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
226d0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
226e0 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
226f0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
22700 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
22710 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
22720 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
22730 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
22740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22750 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
22760 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
22770 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
22780 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
22790 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
227a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
227b0 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
227c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
227d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
227e0 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
227f0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
22800 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
22810 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
22820 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
22830 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
22840 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
22850 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22860 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
22870 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
22880 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
22890 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
228a0 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
228b0 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
228c0 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
228d0 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
228e0 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
228f0 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
22900 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
22910 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
22920 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
22930 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
22940 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
22950 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
22960 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
22970 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
22980 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
22990 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
229a0 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
229b0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
229c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
229d0 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
229e0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
229f0 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
22a00 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
22a10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22a20 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
22a30 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
22a40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
22a50 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
22a60 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
22a70 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
22a80 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
22a90 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70  ex *pIdx;.  .  p
22aa0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
22ab0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
22ac0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22ad0 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
22ae0 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20  _TABLE ) return 
22af0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
22b00 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
22b10 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
22b20 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
22b30 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
22b40 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
22b50 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
22b60 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
22b70 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67  .  if( pItem->fg
22b80 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72  .isIndexedBy ) r
22b90 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
22ba0 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
22bb0 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
22bc0 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
22bd0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
22be0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
22bf0 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d  gs = 0;.  pLoop-
22c00 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54  >nSkip = 0;.  pT
22c10 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
22c20 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
22c30 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
22c40 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  EQ|WO_IS, 0);.  
22c50 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
22c60 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
22c70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
22c80 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  _IS );.    pLoop
22c90 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
22ca0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
22cb0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
22cc0 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
22cd0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
22ce0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
22cf0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
22d00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
22d10 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
22d20 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
22d30 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
22d40 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
22d50 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
22d60 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
22d70 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  10) */.  }else{.
22d80 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
22d90 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
22da0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
22db0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  t){.      int op
22dc0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  Mask;.      asse
22dd0 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rt( pLoop->aLTer
22de0 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61  mSpace==pLoop->a
22df0 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69  LTerm );.      i
22e00 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  f( !IsUniqueInde
22e10 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c  x(pIdx).       |
22e20 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
22e30 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
22e40 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   || pIdx->nKeyCo
22e50 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  l>ArraySize(pLoo
22e60 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
22e70 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
22e80 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  e;.      opMask 
22e90 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  = pIdx->uniqNotN
22ea0 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f  ull ? (WO_EQ|WO_
22eb0 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20  IS) : WO_EQ;.   
22ec0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
22ed0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
22ee0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
22ef0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
22f00 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
22f10 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c  r, j, 0, opMask,
22f20 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
22f30 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
22f40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65  reak;.        te
22f50 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
22f60 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
22f70 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   );.        pLoo
22f80 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
22f90 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
22fa0 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
22fb0 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
22fc0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
22fd0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
22fe0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
22ff0 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
23000 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
23010 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69  ( pIdx->isCoveri
23020 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f  ng || (pItem->co
23030 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
23040 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
23050 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
23060 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
23070 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
23080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
23090 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
230a0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
230b0 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
230c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
230d0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
230e0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
230f0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
23100 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
23110 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
23120 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
23130 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
23140 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
23150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23160 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
23170 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
23180 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
23190 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
231a0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
231b0 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
231c0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  pLoop->maskSelf 
231d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
231e0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
231f0 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
23200 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
23210 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
23220 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
23230 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
23240 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
23250 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
23260 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70  Sat =  pWInfo->p
23270 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
23280 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23290 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
232a0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
232b0 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
232c0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
232d0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
232e0 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
232f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
23300 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
23310 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
23320 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
23330 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
23340 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
23350 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
23360 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
23370 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
23380 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
23390 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
233a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
233b0 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
233c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
233d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
233e0 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
233f0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
23400 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
23410 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
23420 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
23430 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
23440 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
23450 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
23460 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
23470 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
23480 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23490 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
234a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
234b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
234c0 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
234d0 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
234e0 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
234f0 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
23500 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
23510 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
23520 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
23530 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
23540 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
23550 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
23560 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
23570 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
23580 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
23590 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
235a0 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
235b0 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
235c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
235d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
235e0 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
235f0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
23600 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
23610 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
23620 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
23630 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
23640 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
23650 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
23660 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
23670 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
23680 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
23690 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
236a0 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
236b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
236c0 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
236d0 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
236e0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
236f0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
23700 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
23710 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
23720 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
23750 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
23760 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
23790 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
237a0 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
237b0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
237c0 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
237d0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
237e0 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
237f0 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
23800 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
23810 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
23820 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
23830 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
23840 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
23850 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
23860 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
23870 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
23880 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
23890 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
238a0 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
238b0 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
238c0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
238d0 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
238e0 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
238f0 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
23900 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
23910 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
23920 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
23930 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
23940 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
23950 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
23960 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
23970 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
23980 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
23990 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
239a0 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
239b0 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
239c0 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
239d0 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
239e0 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
239f0 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
23a00 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
23a10 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
23a20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
23a30 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
23a40 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
23a50 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
23a60 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
23a70 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
23a80 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
23a90 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
23aa0 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
23ab0 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
23ac0 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
23ad0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
23ae0 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
23af0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
23b00 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
23b10 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
23b20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
23b30 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
23b40 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
23b50 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
23b60 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
23b70 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
23b80 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
23b90 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
23ba0 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
23bb0 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
23bc0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
23bd0 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
23be0 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
23bf0 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
23c00 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
23c10 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
23c20 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
23c30 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
23c40 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
23c50 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
23c60 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
23c70 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
23c80 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
23c90 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
23ca0 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
23cb0 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
23cc0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23cd0 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
23ce0 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
23cf0 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
23d00 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
23d10 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
23d20 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
23d30 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
23d40 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
23d50 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
23d60 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
23d70 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
23d80 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
23d90 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
23da0 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
23db0 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
23dc0 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
23dd0 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
23de0 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
23df0 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
23e00 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
23e10 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
23e20 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
23e30 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
23e40 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
23e50 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
23e60 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
23e70 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
23e80 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
23e90 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
23ea0 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
23eb0 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
23ec0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
23ed0 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
23ee0 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
23ef0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
23f00 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
23f10 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
23f20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
23f30 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
23f40 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
23f50 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
23f60 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
23f70 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
23f80 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
23f90 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
23fa0 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
23fb0 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
23fc0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
23fd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
23fe0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
23ff0 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
24000 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
24010 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
24020 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
24030 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
24040 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
24050 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
24060 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
24070 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
24080 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
24090 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
240a0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
240b0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
240c0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
240d0 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70  ** The iIdxCur p
240e0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
240f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
24100 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a   an index.  If .
24110 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
24120 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
24130 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75  IdxCur is the cu
24140 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
24150 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73  n index.** to us
24160 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  e for OR clause 
24170 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
24180 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68   WHERE clause sh
24190 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a  ould use this.**
241a0 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72   specific cursor
241b0 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50  .  If WHERE_ONEP
241c0 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73  ASS_DESIRED is s
241d0 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72  et, then iIdxCur
241e0 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
241f0 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72   cursor in an ar
24200 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66  ray of cursors f
24210 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20  or all indices. 
24220 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a   iIdxCur should.
24230 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f  ** be used to co
24240 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70  mpute the approp
24250 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70  riate cursor dep
24260 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
24270 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64  index is.** used
24280 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
24290 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
242a0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
242b0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  se,        /* Th
242c0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
242d0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
242e0 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46  TabList,    /* F
242f0 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69  ROM clause: A li
24300 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
24310 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
24320 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
24330 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
24340 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
24350 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
24360 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
24370 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
24380 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72  P BY) clause, or
24390 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
243a0 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
243b0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f   /* Result set o
243c0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
243d0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
243e0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
243f0 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
24400 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
24410 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
24420 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20  nt iIdxCur      
24430 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
24440 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
24450 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
24460 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  sor number */.){
24470 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
24480 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
24490 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
244a0 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
244b0 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
244c0 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
244d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
244e0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
244f0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
24500 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
24510 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
24520 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
24530 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
24540 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
24550 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
24560 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
24570 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
24580 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
24590 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
245a0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
245b0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
245c0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
245d0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
245e0 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
245f0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
24600 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
24610 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
24620 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
24630 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
24640 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
24650 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
24660 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
24670 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
24680 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68  nfo->a[] */.  Wh
24690 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
246a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
246b0 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
246c0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
246d0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
24700 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24710 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
24720 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
24730 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
24740 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24750 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24760 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62  n code */.  u8 b
24770 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 0a 0a  Fordelete = 0;..
24780 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
24790 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
247a0 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d  EPASS_MULTIROW)=
247b0 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20  =0 || (.        
247c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
247d0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
247e0 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26  RED)!=0 .     &&
247f0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
24800 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
24810 4c 4f 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a  LOSE)==0 .  ));.
24820 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
24830 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
24840 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
24850 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  db;.  memset(&sW
24860 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  LB, 0, sizeof(sW
24870 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f  LB));..  /* An O
24880 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c  RDER/GROUP BY cl
24890 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61  ause of more tha
248a0 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f  n 63 terms canno
248b0 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a  t be optimized *
248c0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  /.  testcase( pO
248d0 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
248e0 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  By->nExpr==BMS-1
248f0 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
24900 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
24910 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72  nExpr>=BMS ) pOr
24920 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c  derBy = 0;.  sWL
24930 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  B.pOrderBy = pOr
24940 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73  derBy;..  /* Dis
24950 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
24960 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
24970 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
24980 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
24990 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
249a0 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
249b0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
249c0 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
249d0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
249e0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
249f0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
24a00 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
24a10 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
24a20 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
24a30 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
24a40 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
24a50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
24a60 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
24a70 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
24a80 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
24a90 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
24aa0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
24ab0 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
24ac0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
24ad0 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
24ae0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24af0 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
24b00 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
24b10 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
24b20 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
24b30 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
24b40 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
24b50 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
24b60 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
24b70 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
24b80 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
24b90 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
24ba0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
24bb0 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
24bc0 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
24bd0 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
24be0 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
24bf0 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
24c00 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
24c10 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
24c20 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
24c30 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
24c40 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
24c50 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
24c60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
24c70 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
24c80 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
24c90 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
24ca0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
24cb0 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
24cc0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
24cd0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
24ce0 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
24cf0 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
24d00 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
24d10 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
24d20 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
24d30 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
24d40 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
24d50 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
24d60 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
24d70 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
24d80 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
24d90 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
24da0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
24db0 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
24dc0 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
24dd0 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
24de0 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
24df0 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
24e00 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
24e10 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
24e20 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
24e30 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  */.  nByteWInfo 
24e40 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
24e50 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
24e60 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
24e70 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
24e80 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
24e90 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
24ea0 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
24eb0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
24ec0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
24ed0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
24ee0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24ef0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
24f00 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
24f10 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
24f20 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
24f30 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
24f40 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ] = pWInfo->aiCu
24f50 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31  rOnePass[1] = -1
24f60 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ;.  pWInfo->nLev
24f70 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
24f80 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
24f90 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
24fa0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
24fb0 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
24fc0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
24fd0 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
24fe0 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70  ->pResultSet = p
24ff0 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49  ResultSet;.  pWI
25000 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57  nfo->iBreak = pW
25010 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
25020 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25030 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
25040 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
25050 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
25060 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
25070 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
25080 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
25090 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
250a0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
250b0 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45  S_OFF );  /* ONE
250c0 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f  PASS defaults to
250d0 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53   OFF */.  pMaskS
250e0 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
250f0 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
25100 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
25110 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
25120 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
25130 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
25140 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
25150 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
25160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
25170 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
25180 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
25190 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
251a0 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
251b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
251c0 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
251d0 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
251e0 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
251f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
25200 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
25210 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
25220 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
25230 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
25240 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
25250 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
25260 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
25270 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  Set);.  sqlite3W
25280 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
25290 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
252a0 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  nfo);.  sqlite3W
252b0 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66  hereSplit(&pWInf
252c0 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20  o->sWC, pWhere, 
252d0 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
252e0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
252f0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
25300 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
25310 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
25320 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
25330 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
25340 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
25350 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
25360 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  u..  */.  for(ii
25370 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d  =0; ii<sWLB.pWC-
25380 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
25390 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d     if( nTabList=
253a0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
253b0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
253c0 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  in(sWLB.pWC->a[i
253d0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
253e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
253f0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57  False(pParse, sW
25400 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
25410 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  xpr, pWInfo->iBr
25420 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eak,.           
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
25440 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
25450 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43  ;.      sWLB.pWC
25460 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20  ->a[ii].wtFlags 
25470 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
25480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
25490 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
254a0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
254b0 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
254c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
254d0 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
254e0 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72  >nOBSat = pOrder
254f0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
25500 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
25510 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
25520 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
25530 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
25540 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
25550 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
25560 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
25570 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
25580 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
25590 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
255a0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
255b0 2a 20 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20  * The N-th term 
255c0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
255d0 73 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  se is assigned a
255e0 20 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e   bitmask of 1<<N
255f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
25600 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76  rule of the prev
25610 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e  ious sentence en
25620 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58 20  sures thta if X 
25630 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
25640 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  or.  ** a table 
25650 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74  T, then X-1 is t
25660 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
25670 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ll other tables 
25680 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54  to the left of T
25690 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74  ..  ** Knowing t
256a0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
256b0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
256c0 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
256d0 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20 69 6d 70  join is.  ** imp
256e0 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
256f0 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
25700 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
25710 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
25720 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
25730 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
25740 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20  .  ** pTabList, 
25750 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72  not just the fir
25760 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c  st nTabList tabl
25770 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73  es.  nTabList is
25780 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65   normally.  ** e
25790 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
257a0 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
257b0 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
257c0 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57   1 if the.  ** W
257d0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
257e0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  LY flag is set..
257f0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
25800 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
25810 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63  rc; ii++){.    c
25820 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
25830 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
25840 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
25850 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61    sqlite3WhereTa
25860 62 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65  bFuncArgs(pParse
25870 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  , &pTabList->a[i
25880 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  i], &pWInfo->sWC
25890 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
258a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
258b0 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
258c0 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
258d0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  .    Bitmask m =
258e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
258f0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25900 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
25910 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73  Cursor);.    ass
25920 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42 49 54 28  ert( m==MASKBIT(
25930 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ii) );.  }.#endi
25940 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
25950 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
25960 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20  pressions. */.  
25970 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
25980 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
25990 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
259a0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
259b0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
259c0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
259d0 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
259e0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
259f0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
25a00 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
25a10 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
25a20 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
25a30 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
25a40 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
25a50 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
25a60 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
25a70 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
25a80 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
25a90 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
25aa0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
25ab0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25ac0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
25ad0 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
25ae0 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
25af0 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
25b00 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
25b10 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
25b20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
25b30 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
25b40 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
25b50 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
25b60 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
25b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25b80 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
25b90 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
25ba0 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
25bb0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
25bc0 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
25bd0 20 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78   (wctrlFlags: 0x
25be0 25 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %x)\n",.        
25bf0 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 29       wctrlFlags)
25c00 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  );.#if defined(W
25c10 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25c20 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  D).  if( sqlite3
25c30 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
25c40 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79  00 ){ /* Display
25c50 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
25c60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
25c70 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
25c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42   for(i=0; i<sWLB
25c90 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  .pWC->nTerm; i++
25ca0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65  ){.      whereTe
25cb0 72 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e 70 57  rmPrint(&sWLB.pW
25cc0 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20  C->a[i], i);.   
25cd0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
25ce0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31   if( nTabList!=1
25cf0 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75   || whereShortCu
25d00 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20  t(&sWLB)==0 ){. 
25d10 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
25d20 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a  pAddAll(&sWLB);.
25d30 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
25d40 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
25d50 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45  r;.  .#ifdef WHE
25d60 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
25d70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25d80 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20 20  hereTrace ){    
25d90 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f  /* Display all o
25da0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
25db0 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  objects */.     
25dc0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
25dd0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
25de0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
25df0 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
25e00 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
25e10 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
25e20 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
25e60 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b  MNOPQRSTUVWYXZ";
25e70 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49  .      for(p=pWI
25e80 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30  nfo->pLoops, i=0
25e90 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
25ea0 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  oop, i++){.     
25eb0 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62     p->cId = zLab
25ec0 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62  el[i%sizeof(zLab
25ed0 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  el)];.        wh
25ee0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
25ef0 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20  sWLB.pWC);.     
25f00 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
25f10 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68    .    wherePath
25f20 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30  Solver(pWInfo, 0
25f30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
25f40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
25f50 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
25f60 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  or;.    if( pWIn
25f70 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
25f80 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
25f90 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70  Solver(pWInfo, p
25fa0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31  WInfo->nRowOut+1
25fb0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62  );.       if( db
25fc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
25fd0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
25fe0 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Error;.    }.  }
25ff0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
26000 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64  OrderBy==0 && (d
26010 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
26020 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21  E_ReverseOrder)!
26030 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66  =0 ){.     pWInf
26040 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69  o->revMask = (Bi
26050 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a  tmask)(-1);.  }.
26060 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
26070 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e  rr || NEVER(db->
26080 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b  mallocFailed) ){
26090 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
260a0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23  eginError;.  }.#
260b0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
260c0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
260d0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
260e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
260f0 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
26100 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25   Solution nRow=%
26110 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  d", pWInfo->nRow
26120 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Out);.    if( pW
26130 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29  Info->nOBSat>0 )
26140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
26150 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44  ebugPrintf(" ORD
26160 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c  ERBY=%d,0x%llx",
26170 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c   pWInfo->nOBSat,
26180 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
26190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  );.    }.    swi
261a0 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  tch( pWInfo->eDi
261b0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
261c0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
261d0 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
261e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
261f0 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
26200 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20  INCT=unique");. 
26210 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26220 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
26230 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
26240 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
26250 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26260 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
26270 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  T=ordered");.   
26280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26290 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
262a0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
262b0 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
262c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
262d0 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
262e0 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20  T=unordered");. 
262f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26300 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26310 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26320 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f  tf("\n");.    fo
26330 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66  r(ii=0; ii<pWInf
26340 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29  o->nLevel; ii++)
26350 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
26360 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61  pPrint(pWInfo->a
26370 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c  [ii].pWLoop, sWL
26380 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20  B.pWC);.    }.  
26390 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74  }.#endif.  /* At
263a0 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61  tempt to omit ta
263b0 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  bles from the jo
263c0 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65  in that do not e
263d0 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
263e0 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
263f0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26  ->nLevel>=2.   &
26400 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a  & pResultSet!=0.
26410 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
26420 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
26430 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
26440 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  n).  ){.    Bitm
26450 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71  ask tabUsed = sq
26460 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
26470 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  stUsage(pMaskSet
26480 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20  , pResultSet);. 
26490 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64     if( sWLB.pOrd
264a0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61  erBy ){.      ta
264b0 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33  bUsed |= sqlite3
264c0 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
264d0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c  ge(pMaskSet, sWL
264e0 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  B.pOrderBy);.   
264f0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57   }.    while( pW
26500 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20  Info->nLevel>=2 
26510 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
26520 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
26530 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  ;.      pLoop = 
26540 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f  pWInfo->a[pWInfo
26550 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f  ->nLevel-1].pWLo
26560 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  op;.      if( (p
26570 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
26580 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
26590 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
265a0 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61  _LEFT)==0 ) brea
265b0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63  k;.      if( (wc
265c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
265d0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d  _WANT_DISTINCT)=
265e0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c  =0.       && (pL
265f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
26600 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a  HERE_ONEROW)==0.
26610 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26630 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73        if( (tabUs
26640 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ed & pLoop->mask
26650 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b  Self)!=0 ) break
26660 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73  ;.      pEnd = s
26670 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c  WLB.pWC->a + sWL
26680 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  B.pWC->nTerm;.  
26690 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
266a0 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
266b0 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
266c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
266d0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
266e0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
266f0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
26700 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
26710 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
26720 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
26730 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26740 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26750 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
26760 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20   if( pTerm<pEnd 
26770 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57  ) break;.      W
26780 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
26790 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70  , ("-> drop loop
267a0 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c   %c not used\n",
267b0 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20   pLoop->cId));. 
267c0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65       pWInfo->nLe
267d0 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61  vel--;.      nTa
267e0 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  bList--;.    }. 
267f0 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
26800 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
26810 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
26820 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e  ***\n"));.  pWIn
26830 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65  fo->pParse->nQue
26840 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f  ryLoop += pWInfo
26850 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a  ->nRowOut;..  /*
26860 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
26870 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
26880 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
26890 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
268a0 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
268b0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
268c0 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
268d0 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
268e0 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20  riate..  ** The 
268f0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
26900 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  hm only works if
26910 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26920 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a  e constrains.  *
26930 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
26940 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  to update or del
26950 65 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ete a single row
26960 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
26970 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
26980 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
26990 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
269a0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
269b0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
269c0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
269d0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
269e0 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
269f0 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
26a00 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
26a10 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
26a20 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
26a30 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
26a40 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77  .    if( bOnerow
26a50 20 7c 7c 20 28 20 28 77 63 74 72 6c 46 6c 61 67   || ( (wctrlFlag
26a60 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26a70 53 5f 4d 55 4c 54 49 52 4f 57 29 0a 20 20 20 20  S_MULTIROW).    
26a80 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61 67     && 0==(wsFlag
26a90 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
26aa0 4c 54 41 42 4c 45 29 0a 20 20 20 20 29 29 7b 0a  LTABLE).    )){.
26ab0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
26ac0 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77  nePass = bOnerow
26ad0 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c   ? ONEPASS_SINGL
26ae0 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  E : ONEPASS_MULT
26af0 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  I;.      if( Has
26b00 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e  Rowid(pTabList->
26b10 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28 77  a[0].pTab) && (w
26b20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
26b30 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20  DX_ONLY) ){.    
26b40 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
26b50 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
26b60 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a 20  SS_MULTIROW ){. 
26b70 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65 6c           bFordel
26b80 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f 52  ete = OPFLAG_FOR
26b90 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  DELETE;.        
26ba0 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  }.        pWInfo
26bb0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
26bc0 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67  sFlags = (wsFlag
26bd0 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f  s & ~WHERE_IDX_O
26be0 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NLY);.      }.  
26bf0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70    }.  }..  /* Op
26c00 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
26c10 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
26c20 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
26c30 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
26c40 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
26c50 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
26c60 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
26c70 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
26c80 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
26c90 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
26ca0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
26cb0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
26cc0 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
26cd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26ce0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
26cf0 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
26d00 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
26d10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26d20 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
26d30 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
26d40 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
26d50 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
26d60 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
26d70 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
26d80 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
26d90 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
26da0 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  a);.    pLoop = 
26db0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
26dc0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
26dd0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
26de0 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
26df0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
26e00 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
26e10 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  ng */.    }else.
26e20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26e30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
26e40 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
26e50 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26e60 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
26e70 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
26e80 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
26e90 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
26ea0 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
26eb0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
26ec0 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
26ed0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
26ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26ef0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
26f00 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56  , iCur, 0, 0, pV
26f10 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
26f20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
26f30 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
26f40 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f        /* noop */
26f50 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
26f60 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  f.    if( (pLoop
26f70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26f80 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
26f90 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
26fa0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26fb0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
26fc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
26fd0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
26fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
26ff0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
27000 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
27010 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
27020 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
27030 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
27040 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
27050 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
27060 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
27070 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
27080 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
27090 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
270a0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  b, op);.      sq
270b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
270c0 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65 29  5(v, bFordelete)
270d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
270e0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
270f0 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  r==pLevel->iTabC
27100 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
27110 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
27120 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
27130 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
27140 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
27150 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
27160 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
27170 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
27180 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
27190 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
271a0 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
271b0 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
271c0 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73  >nCol<BMS && Has
271d0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
271e0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
271f0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
27200 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
27210 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
27220 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
27230 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
27240 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27250 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
27260 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
27270 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27290 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
272a0 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
272b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
272c0 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
272d0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   );.      }.#ifd
272e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
272f0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
27300 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  K.      sqlite3V
27310 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
27320 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
27330 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
27340 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  or, 0, 0,.      
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a        (const u8*
27370 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  )&pTabItem->colU
27380 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  sed, P4_INT64);.
27390 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
273a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
273b0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
273c0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
273d0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
273e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
273f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
27400 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
27410 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
27420 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
27430 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
27440 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72     int iIndexCur
27450 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  ;.      int op =
27460 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
27470 20 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20 69      /* iIdxCur i
27480 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20  s always set if 
27490 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  to a positive va
274a0 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69  lue if ONEPASS i
274b0 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  s possible */.  
274c0 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78      assert( iIdx
274d0 43 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66  Cur!=0 || (pWInf
274e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
274f0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
27500 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  SIRED)==0 );.   
27510 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
27520 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  (pTab) && IsPrim
27530 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29  aryKeyIndex(pIx)
27540 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72  .       && (wctr
27550 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
27560 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
27570 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
27580 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65    /* This is one
27590 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f   term of an OR-o
275a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e  ptimization usin
275b0 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
275c0 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a  Y of a.        *
275d0 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
275e0 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20  table.  No need 
275f0 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69  for a separate i
27600 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
27610 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
27620 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20  el->iTabCur;.   
27630 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20       op = 0;.   
27640 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49     }else if( pWI
27650 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
27660 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
27670 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
27680 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
27690 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
276a0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
276b0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61  dxCur;.        a
276c0 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
276d0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
276e0 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
276f0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
27700 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
27710 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
27720 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
27730 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
27740 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
27750 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
27760 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
27770 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
27780 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
27790 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
277a0 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20  lse if( iIdxCur 
277b0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
277c0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
277d0 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
277e0 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
277f0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
27800 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
27810 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  & WHERE_REOPEN_I
27820 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f  DX ) op = OP_Reo
27830 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65  penIdx;.      }e
27840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
27850 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
27860 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
27870 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
27880 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
27890 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
278a0 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
278b0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
278c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
278d0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
278e0 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
278f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27900 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
27910 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
27920 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
27930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
27940 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
27950 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
27960 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
27970 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
27980 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20  NSTRAINT)!=0.   
27990 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
279a0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
279b0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
279c0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d  HERE_SKIPSCAN))=
279d0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
279e0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
279f0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
27a00 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  _MIN)==0.       
27a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
27a20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27a30 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
27a40 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
27a50 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
27a60 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
27a70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
27a80 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
27a90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27aa0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
27ab0 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
27ac0 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
27ad0 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
27ae0 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
27af0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
27b00 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
27b10 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
27b20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
27b30 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
27b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27b50 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
27b60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27b70 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
27b80 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
27b90 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
27ba0 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
27bb0 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
27bc0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
27bd0 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
27be0 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
27bf0 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
27c00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
27c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
27c20 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
27c30 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
27c40 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
27c70 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
27c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
27c90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
27ca0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
27cb0 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
27cc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
27cd0 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
27ce0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
27cf0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
27d00 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
27d10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27d20 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
27d30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27d40 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
27d50 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
27d60 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
27d70 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
27d80 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
27d90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
27da0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
27db0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
27dc0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
27dd0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
27de0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
27df0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
27e00 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
27e10 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
27e20 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
27e30 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c      int addrExpl
27e40 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46  ain;.    int wsF
27e50 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
27e60 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
27e70 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d  ];.    wsFlags =
27e80 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
27e90 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65  >wsFlags;.#ifnde
27ea0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27eb0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
27ec0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
27ed0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
27ee0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
27ef0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
27f00 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
27f10 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
27f20 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
27f40 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
27f50 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
27f60 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
27f70 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
27f80 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
27f90 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
27fa0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27fb0 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
27fc0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
27fd0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
27fe0 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c     pParse, pTabL
27ff0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
28000 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
28010 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29  wctrlFlags.    )
28020 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
28030 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
28040 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
28050 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
28060 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43   = sqlite3WhereC
28070 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
28080 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
28090 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
280a0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
280b0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
280c0 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67  .    if( (wsFlag
280d0 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
280e0 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c  )==0 && (wctrlFl
280f0 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
28100 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  LE_ONLY)==0 ){. 
28110 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
28120 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28 76  eAddScanStatus(v
28130 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
28140 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29  el, addrExplain)
28150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28160 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62  * Done. */.  Vdb
28170 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
28180 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
28190 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72  core"));.  retur
281a0 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
281b0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
281c0 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
281d0 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
281e0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
281f0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
28200 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
28210 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
28220 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
28230 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
28240 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
28250 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
28260 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
28270 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
28280 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
28290 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
282a0 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
282b0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
282c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
282d0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
282e0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
282f0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
28300 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
28310 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28320 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28330 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
28340 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
28350 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
28360 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
28370 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
28380 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
28390 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
283a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
283b0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
283c0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
283d0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
283e0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
283f0 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
28400 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
28410 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
28420 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
28430 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28440 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
28450 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
28460 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
28470 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
28480 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
28490 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
284a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
284b0 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
284c0 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
284d0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
284e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
284f0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
28500 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
28510 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
28520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28530 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
28540 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
28550 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
28560 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28570 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
28580 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
28590 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
285a0 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
285b0 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
285c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
285d0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
285e0 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20  p==OP_VNext);.  
285f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
28600 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28610 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
28620 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
28630 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
28640 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
28650 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
28660 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
28670 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
28680 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
28690 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
286a0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
286b0 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
286c0 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
286d0 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
286e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
286f0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
28700 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
28710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
28730 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
28740 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
28750 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
28760 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
28770 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
28780 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
28790 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
287a0 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20  _PrevIfOpen);.  
287b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
287c0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
287d0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
287e0 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
287f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28800 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
28810 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
28820 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
28830 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28840 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
28850 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
28860 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
28870 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
28880 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70  te3VdbeGoto(v, p
28890 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
288a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
288b0 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b  ent((v, "next sk
288c0 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
288d0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
288e0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
288f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28900 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
28910 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
28920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28930 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
28940 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29  vel->addrSkip-2)
28950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28960 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
28970 52 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Rep ){.      int
28980 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73   op;.      if( s
28990 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
289a0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  v, pLevel->addrL
289b0 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b  ikeRep-1)->p1 ){
289c0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
289d0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20  _DecrJumpZero;. 
289e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
289f0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70      op = OP_Jump
28a00 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20  ZeroIncr;.      
28a10 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
28a20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
28a30 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
28a40 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61  pCntr, pLevel->a
28a50 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20  ddrLikeRep);.   
28a60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
28a70 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
28a80 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
28a90 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64  oin ){.      add
28aa0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
28ab0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
28ac0 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
28ad0 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72  Join); VdbeCover
28ae0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73  age(v);.      as
28af0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
28b00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
28b10 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
28b20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d        || (pLoop-
28b30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28b40 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
28b50 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
28b60 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28b70 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
28b80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28b90 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
28ba0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
28bb0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
28bc0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28bd0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
28be0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
28bf0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  EXED ){.        
28c00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28c10 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
28c20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
28c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28c40 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
28c50 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
28c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28c70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
28c80 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
28c90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
28ca0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
28cb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28cc0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
28cd0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
28ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
28cf0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
28d00 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
28d10 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c   }.    VdbeModul
28d20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
28d30 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  d WHERE-loop%d: 
28d40 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  %s", i,.        
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
28d60 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
28d70 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
28d80 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
28d90 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
28da0 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
28db0 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
28dc0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
28dd0 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
28de0 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
28df0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28e00 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
28e10 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65  iBreak);..  asse
28e20 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
28e30 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
28e40 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
28e50 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
28e60 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
28e70 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
28e80 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  ++){.    int k, 
28e90 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70  last;.    VdbeOp
28ea0 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78   *pOp;.    Index
28eb0 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
28ec0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28ed0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
28ee0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
28ef0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
28f00 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
28f10 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
28f20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
28f30 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
28f40 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
28f50 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  ;..    /* For a 
28f60 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e  co-routine, chan
28f70 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e  ge all OP_Column
28f80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
28f90 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
28fa0 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  ** the co-routin
28fb0 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f  e into OP_Copy o
28fc0 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  f result contain
28fd0 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
28fe0 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69  ..    ** OP_Rowi
28ff0 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c  d becomes OP_Nul
29000 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
29010 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76  ( pTabItem->fg.v
29020 69 61 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21  iaCoroutine && !
29030 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29040 20 29 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c   ){.      transl
29050 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
29060 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
29070 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
29080 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
290b0 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 63 6f  esult);.      co
290c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
290d0 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20     /* Close all 
290e0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
290f0 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
29100 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
29110 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63  egin..    ** Exc
29120 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73  ept, do not clos
29130 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
29140 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62 79  ill be reused by
29150 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61   the OR optimiza
29160 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45  tion.    ** (WHE
29170 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
29180 53 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74  SE).  And do not
29190 20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70   close the OP_Op
291a0 65 6e 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a  enWrite cursors.
291b0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66      ** created f
291c0 6f 72 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f  or the ONEPASS o
291d0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20  ptimization..   
291e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61   */.    if( (pTa
291f0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
29200 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20  _Ephemeral)==0. 
29210 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65      && pTab->pSe
29220 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20  lect==0.     && 
29230 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
29240 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
29250 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a  _OPEN_CLOSE)==0.
29260 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
29270 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
29280 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
29290 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
292a0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
292b0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58   (ws & WHERE_IDX
292c0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
292d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
292e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
292f0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
29300 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
29310 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20        if( (ws & 
29320 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
29330 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73 20  0.       && (ws 
29340 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
29350 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d  RE_AUTO_INDEX))=
29360 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c  =0 .       && pL
29370 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70  evel->iIdxCur!=p
29380 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
29390 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a  ass[1].      ){.
293a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
293b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
293c0 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
293d0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
293e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
293f0 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
29400 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
29410 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74 69  VDBE code substi
29420 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20  tutions to read 
29430 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  data.    ** from
29440 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65   the index inste
29450 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74  ad of from the t
29460 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69  able where possi
29470 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61  ble.  In some ca
29480 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ses.    ** this 
29490 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65  optimization pre
294a0 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20  vents the table 
294b0 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20  from ever being 
294c0 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a  read, which can.
294d0 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73      ** yield a s
294e0 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f  ignificant perfo
294f0 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20  rmance boost..  
29500 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
29510 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
29520 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
29530 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
29540 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
29550 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
29560 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
29570 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
29580 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
29590 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
295a0 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
295b0 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
295c0 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
295d0 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
295e0 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
295f0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
29600 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
29610 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
29620 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
29630 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
29640 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
29650 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44  ags & (WHERE_IND
29660 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f  EXED|WHERE_IDX_O
29670 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49  NLY) ){.      pI
29680 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
29690 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
296a0 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
296b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
296c0 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
296d0 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
296e0 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20  ->u.pCovidx;.   
296f0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 0a   }.    if( pIdx.
29700 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
29710 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
29720 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f  SS_OFF || !HasRo
29730 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
29740 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e  )).     && !db->
29750 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20  mallocFailed.   
29760 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d   ){.      last =
29770 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
29780 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
29790 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64    k = pLevel->ad
297a0 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f  drBody;.      pO
297b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
297c0 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20  etOp(v, k);.    
297d0 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20    for(; k<last; 
297e0 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  k++, pOp++){.   
297f0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
29800 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
29810 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
29820 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
29830 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
29840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
29850 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  t x = pOp->p2;. 
29860 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29870 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70   pIdx->pTable==p
29880 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab );.         
29890 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
298a0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
298b0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
298c0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
298d0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
298e0 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70             x = p
298f0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b  Pk->aiColumn[x];
29900 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
29910 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
29920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29930 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
29940 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
29950 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
29960 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20  if( x>=0 ){.    
29970 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
29980 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = x;.           
29990 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
299a0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
299b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
299c0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
299d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
299e0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c  E_IDX_ONLY)==0 |
299f0 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  | x>=0 );.      
29a00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
29a10 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
29a20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
29a30 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
29a40 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
29a50 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
29a60 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
29a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29a90 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20   Final cleanup. 
29aa0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51   */.  pParse->nQ
29ab0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
29ac0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
29ad0 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  op;.  whereInfoF
29ae0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
29af0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.