/ Hex Artifact Content
Login

Artifact 984084584c10c41e46c89ac027a5cca991bc37e6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53  * Return ONEPASS
0840: 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20 55  _OFF (0) if an U
0850: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0860: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61  statement is una
0870: 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74  ble to.** operat
0880: 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68  e directly on th
0890: 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64  e rowis returned
08a0: 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75   by a WHERE clau
08b0: 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f  se.  Return.** O
08c0: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31  NEPASS_SINGLE (1
08d0: 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) if the stateme
08e0: 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e  nt can operation
08f0: 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75 73   directly becaus
0900: 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67  e only.** a sing
0910: 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20  le row is to be 
0920: 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e  changed.  Return
0930: 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28   ONEPASS_MULTI (
0940: 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61  2) if the one-pa
0950: 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  ss.** optimizati
0960: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f  on can be used o
0970: 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a  n multiple .**.*
0980: 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53  * If the ONEPASS
0990: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
09a0: 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72   used (if this r
09b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
09c0: 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73  rue).** then als
09d0: 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69  o write the indi
09e0: 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73  ces of open curs
09f0: 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50  ors used by ONEP
0a00: 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75  ASS.** into aiCu
0a10: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0a20: 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74  ].  iaCur[0] get
0a30: 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20  s the cursor of 
0a40: 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c  the data.** tabl
0a50: 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67  e and iaCur[1] g
0a60: 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75  ets the cursor u
0a70: 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69  sed by an auxili
0a80: 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69  ary index..** Ei
0a90: 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62  ther value may b
0aa0: 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67  e -1, indicating
0ab0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20   that cursor is 
0ac0: 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79  not used..** Any
0ad0: 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65   cursors returne
0ae0: 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  d will have been
0af0: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
0b00: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72  ing..**.** aiCur
0b10: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
0b20: 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20   both get -1 if 
0b30: 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65  the where-clause
0b40: 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61   logic is.** una
0b50: 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f  ble to use the O
0b60: 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
0b70: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
0b80: 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73  te3WhereOkOnePas
0b90: 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  s(WhereInfo *pWI
0ba0: 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29  nfo, int *aiCur)
0bb0: 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72  {.  memcpy(aiCur
0bc0: 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  , pWInfo->aiCurO
0bd0: 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69  nePass, sizeof(i
0be0: 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57  nt)*2);.#ifdef W
0bf0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
0c00: 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
0c10: 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57 49  hereTrace && pWI
0c20: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
0c30: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
0c40: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
0c50: 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72 73  intf("%s cursors
0c60: 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  : %d %d\n",.    
0c70: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e       pWInfo->eOn
0c80: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53  ePass==ONEPASS_S
0c90: 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53  INGLE ? "ONEPASS
0ca0: 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50  _SINGLE" : "ONEP
0cb0: 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20  ASS_MULTI",.    
0cc0: 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61       aiCur[0], a
0cd0: 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65  iCur[1]);.  }.#e
0ce0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57  ndif.  return pW
0cf0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a  Info->eOnePass;.
0d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0d10: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0d20: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0d30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0d40: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0d50: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0d60: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0d70: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0d80: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0d90: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0da0: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0db0: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0dc0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0dd0: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0de0: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0df0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0e00: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0e10: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0e20: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0e30: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0e40: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0e50: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0e60: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0e70: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0e80: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0e90: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0ea0: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0eb0: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0ec0: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0ed0: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0ee0: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0ef0: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0f00: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0f10: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0f20: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0f30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0f40: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0f50: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0f60: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0f70: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0f90: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0fa0: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0fb0: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0fc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0fd0: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0fe0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0ff0: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
1000: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
1010: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
1020: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
1030: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
1040: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
1050: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
1060: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
1070: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
1080: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
1090: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
10a0: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
10b0: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
10c0: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
10d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10f0: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
1100: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
1110: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
1120: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
1130: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
1140: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
1150: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
1160: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1170: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
1180: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
1190: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
11a0: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
11b0: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
11c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
11d0: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
11e0: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
11f0: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
1200: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
1210: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
1220: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1230: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1240: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1250: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
1260: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
1270: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
1280: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
1290: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
12a0: 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74  */.Bitmask sqlit
12b0: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57  e3WhereGetMask(W
12c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
12d0: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
12e0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
12f0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1300: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
1310: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
1320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
1330: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
1340: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
1350: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
1360: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1370: 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
1380: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
13a0: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
13b0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
13c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
13d0: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
13e0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
13f0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
1400: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
1410: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1420: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
1430: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
1440: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
1450: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
1460: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
1470: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
1480: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
1490: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
14a0: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
14b0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
14c0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
14d0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
14e0: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
14f0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
1500: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
1510: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
1520: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
1530: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
1540: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  sor;.}../*.** Ad
1550: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1560: 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74  t WhereTerm that
1570: 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69   matches accordi
1580: 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72  ng to the criter
1590: 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65  ia.** establishe
15a0: 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e  d when the pScan
15b0: 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74   object was init
15c0: 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65  ialized by where
15d0: 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52  ScanInit()..** R
15e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
15f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1600: 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65  matching WhereTe
1610: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  rms..*/.static W
1620: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
1630: 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61  canNext(WhereSca
1640: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74  n *pScan){.  int
1650: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
1660: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1670: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1680: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20  e term */.  i16 
1690: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
16a0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
16b0: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
16c0: 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49   term.  -1 for I
16d0: 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  PK */.  Expr *pX
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  An expression be
1700: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
1710: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1720: 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  ;    /* Shorthan
1730: 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43  d for pScan->pWC
1740: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1750: 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68  *pTerm;    /* Th
1760: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73  e term being tes
1770: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d  ted */.  int k =
1780: 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a   pScan->k;    /*
1790: 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20   Where to start 
17a0: 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77  scanning */..  w
17b0: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
17c0: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
17d0: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
17e0: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53   pScan->aiCur[pS
17f0: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1800: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53      iColumn = pS
1810: 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 53  can->aiColumn[pS
1820: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1830: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
1840: 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63 61  =XN_EXPR && pSca
1850: 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29  n->pIdxExpr==0 )
1860: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
1870: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
1880: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
1890: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
18a0: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
18b0: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
18c0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
18d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
18e0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
18f0: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
1900: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
1910: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
1920: 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52  iColumn!=XN_EXPR
1930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
1940: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1950: 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  are(pTerm->pExpr
1960: 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70  ->pLeft,pScan->p
1970: 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30  IdxExpr,iCur)==0
1980: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
1990: 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20  Scan->iEquiv<=1 
19a0: 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
19b0: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
19c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
19d0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
19e0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1a00: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
1a10: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
1a20: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
1a30: 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20  pScan->aiCur).  
1a40: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20           && (pX 
1a50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1a60: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
1a70: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d  pExpr->pRight))-
1a80: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
1a90: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
1ab0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1ac0: 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71  =0; j<pScan->nEq
1ad0: 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  uiv; j++){.     
1ae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
1af0: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58  an->aiCur[j]==pX
1b00: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
1b10: 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e          && pScan
1b20: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70  ->aiColumn[j]==p
1b30: 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  X->iColumn ){.  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b80: 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e   if( j==pScan->n
1b90: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20  Equiv ){.       
1ba0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69         pScan->ai
1bb0: 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61  Cur[j] = pX->iTa
1bc0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
1bd0: 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75     pScan->aiColu
1be0: 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c  mn[j] = pX->iCol
1bf0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
1c00: 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76     pScan->nEquiv
1c10: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1c20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1c30: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
1c40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1c50: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
1c60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1c70: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
1c80: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
1c90: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
1ca0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
1cb0: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
1cc0: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
1cd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1ce0: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
1d00: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
1d20: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
1d30: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d50: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1d60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1d70: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
1d80: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
1d90: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1db0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dd0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1de0: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1e00: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
1e10: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1e20: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
1e60: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
1e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e80: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
1e90: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1ea0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ec0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1ed0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
1ee0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
1ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f00: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f30: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1f40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1f50: 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a  O_EQ|WO_IS))!=0.
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1f70: 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  (pX = pTerm->pEx
1f80: 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d  pr->pRight)->op=
1f90: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
1fa0: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
1fb0: 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69  Table==pScan->ai
1fc0: 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  Cur[0].         
1fd0: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
1fe0: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c  mn==pScan->aiCol
1ff0: 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  umn[0].         
2000: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2010: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2020: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2030: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
2040: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2050: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2060: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
2070: 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20  n->k = k+1;.    
2080: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2090: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
20a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20b0: 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d    }.      pScan-
20c0: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
20d0: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
20e0: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   k = 0;.    }.  
20f0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
2100: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20  Scan->pOrigWC;. 
2110: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53     k = 0;.    pS
2120: 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20  can->iEquiv++;. 
2130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2150: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
2160: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
2170: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2180: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
2190: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
21a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
21b0: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
21c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
21d0: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
21e0: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
21f0: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
2200: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
2210: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
2220: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
2230: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
2240: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
2250: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
2260: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
2270: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
2280: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
2290: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
22a0: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
22b0: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
22c0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
22d0: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
22e0: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
22f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2300: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
2310: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
2320: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
2330: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
2340: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
2350: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
2360: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
2370: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
2380: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
2390: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
23a0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
23b0: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
23c0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
23d0: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
23e0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
23f0: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
2400: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  Idx..*/.static W
2410: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
2420: 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65  canInit(.  Where
2430: 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20  Scan *pScan,    
2440: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53     /* The WhereS
2450: 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  can object being
2460: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2470: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2480: 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC,       /* The
2490: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
24a0: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
24b0: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
24c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
24d0: 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  or to scan for *
24e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2500: 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f  olumn to scan fo
2510: 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73  r */.  u32 opMas
2520: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
2530: 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f  * Operator(s) to
2540: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49   scan for */.  I
2550: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2560: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
2570: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
2580: 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  h this index */.
2590: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a  ){.  int j = 0;.
25a0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
25b0: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
25c0: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
25d0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
25e0: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
25f0: 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e  = pWC;.  pScan->
2600: 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20  pIdxExpr = 0;.  
2610: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
2620: 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  j = iColumn;.   
2630: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
2640: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2650: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58    if( iColumn==X
2660: 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d 3e  N_EXPR ) pScan->
2670: 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d  pIdxExpr = pIdx-
2680: 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
2690: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  pExpr;.  }.  if(
26a0: 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e   pIdx && iColumn
26b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e  >=0 ){.    pScan
26c0: 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d  ->idxaff = pIdx-
26d0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
26e0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
26f0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
2700: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
2710: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
2720: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
2730: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
2740: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
2750: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2760: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2770: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2780: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2790: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
27a0: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
27b0: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
27c0: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
27d0: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
27e0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
27f0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2800: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2810: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2820: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2830: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2840: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2850: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2860: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2870: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2880: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
2890: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
28a0: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
28b0: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
28c0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
28d0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
28e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28f0: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
2900: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
2910: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49  und..**.** If pI
2920: 64 78 21 3d 30 20 74 68 65 6e 20 73 65 61 72 63  dx!=0 then searc
2930: 68 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63  h for terms matc
2940: 68 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e  hing the iColumn
2950: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49  -th column of pI
2960: 64 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  dx.** rather tha
2970: 6e 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  n the iColumn-th
2980: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2990: 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iCur..**.** The
29a0: 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d   term returned m
29b0: 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e  ight by Y=<expr>
29c0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f   if there is ano
29d0: 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20  ther constraint 
29e0: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
29f0: 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63  clause that spec
2a00: 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20  ifies that X=Y. 
2a10: 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72   Any such constr
2a20: 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  aints will be.**
2a30: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
2a40: 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20  he WO_EQUIV bit 
2a50: 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f  in the pTerm->eO
2a60: 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20  perator field.  
2a70: 54 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69  The.** aiCur[]/i
2a80: 61 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73  aColumn[] arrays
2a90: 20 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20   hold X and all 
2aa0: 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e  its equivalents.
2ab0: 20 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a   There are 11.**
2ac0: 20 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b   slots in aiCur[
2ad0: 5d 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20  ]/aiColumn[] so 
2ae0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
2af0: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
2b00: 73 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74  s up to 10.** ot
2b10: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
2b20: 61 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20  alues.  Hence a 
2b30: 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c  search for X wil
2b40: 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20  l return <expr> 
2b50: 69 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41  if X=A1.** and A
2b60: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61  1=A2 and A2=A3 a
2b70: 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31  nd ... and A9=A1
2b80: 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e  0 and A10=<expr>
2b90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
2ba0: 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65   are multiple te
2bb0: 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
2bc0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
2bd0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2be0: 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20  r>".** then try 
2bf0: 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68  for the one with
2c00: 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73   no dependencies
2c10: 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20   on <expr> - in 
2c20: 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72  other words wher
2c30: 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61  e.** <expr> is a
2c40: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
2c50: 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  sion of some kin
2c60: 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20  d.  Only return 
2c70: 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68  entries of.** th
2c80: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
2c90: 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63  " where Y is a c
2ca0: 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72  olumn in another
2cb0: 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72   table if no ter
2cc0: 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  ms of.** the for
2cd0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74  m "X <op> <const
2ce0: 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20  -expr>" exist.  
2cf0: 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74   If no terms wit
2d00: 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53  h a constant RHS
2d10: 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74  .** exist, try t
2d20: 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20  o return a term 
2d30: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
2d40: 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57  e WO_EQUIV..*/.W
2d50: 68 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65  hereTerm *sqlite
2d60: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a  3WhereFindTerm(.
2d70: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2d80: 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
2d90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
2da0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
2db0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
2dc0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2dd0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2de0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
2df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e00: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  mn number of LHS
2e10: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
2e20: 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52  tReady,     /* R
2e30: 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72  HS must not over
2e40: 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61  lap with this ma
2e50: 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20  sk */.  u32 op, 
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e70: 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76   Mask of WO_xx v
2e80: 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67  alues describing
2e90: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49   operator */.  I
2ea0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2eb0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2ec0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
2ed0: 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e  this index, if n
2ee0: 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
2ef0: 57 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75  WhereTerm *pResu
2f00: 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54  lt = 0;.  WhereT
2f10: 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53  erm *p;.  WhereS
2f20: 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d  can scan;..  p =
2f30: 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
2f40: 73 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c  scan, pWC, iCur,
2f50: 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49   iColumn, op, pI
2f60: 64 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f  dx);.  op &= WO_
2f70: 45 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c  EQ|WO_IS;.  whil
2f80: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
2f90: 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  (p->prereqRight 
2fa0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
2fb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
2fc0: 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26  rereqRight==0 &&
2fd0: 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f   (p->eOperator&o
2fe0: 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)!=0 ){.       
2ff0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f   testcase( p->eO
3000: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
3010: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3020: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
3030: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
3040: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
3050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
3060: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
3070: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
3080: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
3090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30a0: 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74  n searches pList
30b0: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68   for an entry th
30c0: 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
30d0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
30e0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
30f0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
3100: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
3110: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
3120: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
3130: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
3140: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
3150: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
3160: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
3170: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
3180: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
3190: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
31a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
31b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
31c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
31f0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
3200: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3220: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
3230: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
3240: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
3250: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3270: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
3280: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
3290: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32b0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
32c0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
32d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
32e0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
32f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
3300: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
3310: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
3320: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3330: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
3340: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
3350: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3360: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3370: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
3380: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
3390: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
33a0: 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
33b0: 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
33c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
33d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
33e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
33f0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
3400: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
3410: 70 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  pColl && 0==sqli
3420: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
3430: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
3440: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3450: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
3460: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3470: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
3480: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
3490: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
34a0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  of index pIdx is
34b0: 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61   NOT NULL.*/.sta
34c0: 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c  tic int indexCol
34d0: 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78  umnNotNull(Index
34e0: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
34f0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
3500: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
3510: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
3520: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
3530: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20  >nColumn );.  j 
3540: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
3550: 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e  [iCol];.  if( j>
3560: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3570: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
3580: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a  Col[j].notNull;.
3590: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28    }else if( j==(
35a0: 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
35b0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
35c0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32    assert( j==(-2
35d0: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
35e0: 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e  0;  /* Assume an
35f0: 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73   indexed express
3600: 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79  ion can always y
3610: 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a  ield a NULL */..
3620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
3630: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
3640: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
3650: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
3660: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
3670: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
3680: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
3690: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
36a0: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79  redundant if any
36b0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63   subset of the c
36c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  olumns in the.**
36d0: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61   DISTINCT list a
36e0: 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  re collectively 
36f0: 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76  unique and indiv
3700: 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c  idually non-null
3710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3720: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
3730: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
3740: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
3750: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3760: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
3770: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
3780: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
3790: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
37a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
37b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
37c0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
37d0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
37e0: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  t       /* The r
37f0: 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e  esult set that n
3800: 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49  eeds to be DISTI
3810: 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  NCT */.){.  Tabl
3820: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
3830: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
3860: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
3870: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
3880: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
3890: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
38a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
38b0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
38c0: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
38d0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
38e0: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
38f0: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
3900: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
3910: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
3920: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
3930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
3940: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
3950: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
3960: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
3970: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
3980: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
3990: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
39a0: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
39b0: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
39c0: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
39d0: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
39e0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
39f0: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
3a00: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
3a10: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
3a20: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
3a30: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
3a40: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
3a50: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
3a60: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
3a70: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3a80: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3a90: 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d  llate(pDistinct-
3aa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3ab0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3ac0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
3ad0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
3ae0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
3af0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
3b00: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
3b10: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
3b20: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
3b30: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
3b40: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
3b50: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
3b60: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
3b70: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
3b80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
3b90: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
3ba0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
3bb0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
3bc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
3bd0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
3be0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
3bf0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
3c00: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
3c10: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
3c20: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
3c30: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
3c40: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
3c50: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
3c60: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
3c70: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
3c80: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
3c90: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
3ca0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
3cb0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
3cc0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
3cd0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
3ce0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
3cf0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
3d00: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
3d10: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
3d20: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
3d30: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
3d40: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
3d50: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
3d60: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
3d70: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
3d80: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
3d90: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
3da0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
3db0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
3dc0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
3dd0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
3de0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
3df0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
3e00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
3e10: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
3e20: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
3e30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
3e40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
3e50: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
3e60: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
3e70: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
3e80: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
3e90: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
3ea0: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
3eb0: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
3ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3ed0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
3ee0: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
3ef0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
3f00: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
3f10: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
3f20: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
3f30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
3f40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3f50: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
3f60: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
3f70: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
3f80: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
3f90: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
3fa0: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
3fb0: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
3fc0: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
3fd0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
3fe0: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
3ff0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
4000: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
4010: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
4020: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
4030: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
4040: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
4050: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
4060: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
4070: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
4080: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
4090: 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74  o OP_Copy when t
40a0: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
40b0: 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  g accessed via c
40c0: 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e  o-routine .** in
40d0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
40e0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a  le lookup..**.**
40f0: 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77   If the bIncrRow
4100: 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  id parameter is 
4110: 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52  0, then any OP_R
4120: 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  owid instruction
4130: 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69  s on.** cursor i
4140: 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73  TabCur are trans
4150: 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e  formed into OP_N
4160: 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63  ull. Or, if bInc
4170: 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  rRowid is non-ze
4180: 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68  ro,.** then each
4190: 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61   OP_Rowid is tra
41a0: 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e  nsformed into an
41b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
41c0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  increment the.**
41d0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
41e0: 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69   its output regi
41f0: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
4200: 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f  void translateCo
4210: 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64  lumnToCopy(.  Vd
4220: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4230: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f    /* The VDBE co
4240: 6e 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f  ntaining code to
4250: 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20   translate */.  
4260: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
4270: 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65      /* Translate
4280: 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64   from this opcod
4290: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  e to the end */.
42a0: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
42b0: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75        /* OP_Colu
42c0: 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65  mn/OP_Rowid refe
42d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
42e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
42f0: 65 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a  egister,      /*
4300: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   The first colum
4310: 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67  n is in this reg
4320: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  ister */.  int b
4330: 49 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f  IncrRowid      /
4340: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * If non-zero, t
4350: 72 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69  ransform OP_rowi
4360: 64 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31  d to OP_AddImm(1
4370: 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70  ) */.){.  VdbeOp
4380: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
4390: 64 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61  dbeGetOp(v, iSta
43a0: 72 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  rt);.  int iEnd 
43b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
43c0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66  rentAddr(v);.  f
43d0: 6f 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64  or(; iStart<iEnd
43e0: 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b  ; iStart++, pOp+
43f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  +){.    if( pOp-
4400: 3e 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63  >p1!=iTabCur ) c
4410: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
4420: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
4430: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
4440: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
4450: 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f  P_Copy;.      pO
4460: 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20  p->p1 = pOp->p2 
4470: 2b 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20  + iRegister;.   
4480: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70     pOp->p2 = pOp
4490: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ->p3;.      pOp-
44a0: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  >p3 = 0;.    }el
44b0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
44c0: 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
44d0: 20 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52        if( bIncrR
44e0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
44f0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
4500: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
4510: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
4520: 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e  of the OP_Rowid.
4530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   */.        pOp-
4540: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64  >opcode = OP_Add
4550: 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  Imm;.        pOp
4560: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ->p1 = pOp->p2;.
4570: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
4580: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
4590: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  {.        pOp->o
45a0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
45b0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
45c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
45d0: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20  p->p3 = 0;.     
45e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
45f0: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
4600: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
4610: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
4620: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
4630: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
4640: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
4650: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
4660: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
4670: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
4680: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
4690: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
46a0: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
46b0: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
46c0: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
46d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
46e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
46f0: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
4700: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
4710: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
4720: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
4730: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4740: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4750: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4760: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4780: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
4790: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
47a0: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
47b0: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
47c0: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
47d0: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
47e0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
47f0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4800: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
4810: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4820: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
4830: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
4840: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
4850: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4860: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
4870: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4880: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
4890: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
48a0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
48b0: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
48c0: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
48d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
48e0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
48f0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
4900: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
4910: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
4920: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4930: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
4940: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4950: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4960: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4970: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4980: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4990: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
49a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
49b0: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
49c0: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
49d0: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
49e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
49f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
4a00: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
4a10: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4a20: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
4a30: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
4a40: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4a50: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
4a60: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
4a70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4a80: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
4a90: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
4aa0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4ab0: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
4ac0: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
4ad0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
4ae0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4af0: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b00: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
4b10: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
4b20: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4b30: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b40: 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20  edRows=%lld\n", 
4b50: 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  p->estimatedRows
4b60: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
4b70: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
4b80: 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
4b90: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
4ba0: 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
4bb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4bc0: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
4bd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
4be0: 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
4bf0: 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
4c00: 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
4c10: 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
4c20: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
4c30: 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
4c40: 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
4c50: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
4c60: 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4c80: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
4c90: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
4ca0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
4cb0: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
4cc0: 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
4cd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4cf0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
4d00: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
4d10: 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
4d20: 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
4d40: 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
4d50: 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
4d60: 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
4d70: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
4d80: 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
4d90: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
4da0: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4db0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
4dc0: 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  _EQ|WO_IS))==0 )
4dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4de0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
4df0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4e00: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
4e10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
4e20: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
4e30: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
4e40: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
4e50: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
4e60: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
4e70: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
4e80: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
4e90: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
4ea0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
4eb0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
4ec0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4ed0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
4ee0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
4ef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4f00: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4f10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4f20: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
4f30: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
4f40: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
4f50: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
4f60: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
4f70: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
4f80: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
4f90: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
4fa0: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
4fb0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
4fc0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
4fd0: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
4fe0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
4ff0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5010: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
5020: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
5030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5040: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5050: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5060: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5070: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5080: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5090: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
50a0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
50b0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
50c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
50d0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
50e0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
50f0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
5100: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
5110: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
5120: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
5130: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5160: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5170: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5190: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
51a0: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
51b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
51c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
51d0: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
51e0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
51f0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
5200: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
5210: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
5220: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
5230: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5240: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5270: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5280: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5290: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
52b0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
52c0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
52d0: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
52e0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5300: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
5310: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5320: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
5330: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5340: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5350: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5360: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5370: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5380: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5390: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
53a0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
53b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
53c0: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
53d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
53f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5400: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5420: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5430: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5440: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5450: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5460: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5470: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5480: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5490: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
54b0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
54c0: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
54e0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
54f0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
5500: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5510: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5520: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5530: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5540: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5550: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5560: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5570: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5580: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5590: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
55a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
55b0: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
55c0: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
55d0: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
55e0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
55f0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
5600: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5610: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5620: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5630: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5640: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5650: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5660: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5670: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5680: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5690: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
56a0: 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20  ddrCounter = 0; 
56b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
56c0: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
56d0: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
56e0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
56f0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5700: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5710: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
5720: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
5730: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
5740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5750: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
5760: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
5770: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
5780: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
5790: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
57a0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
57b0: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
57c0: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
57d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
57e0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
57f0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
5800: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
5810: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
5820: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
5830: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5840: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
5850: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5860: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
5870: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
5880: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
5890: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
58a0: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
58b0: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
58c0: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
58d0: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
58e0: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
58f0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
5900: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
5910: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
5920: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
5930: 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
5940: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
5950: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
5960: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5970: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
5980: 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72  omJoin)    /* pr
5990: 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  ereq always non-
59a0: 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20  zero */.        
59b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
59c0: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63  tJoinTable!=pSrc
59d0: 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20  ->iCursor   /*  
59e0: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
59f0: 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  and   */.       
5a00: 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72    || pLoop->prer
5a10: 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  eq!=0 );        
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a30: 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46    table of a LEF
5a40: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66  T JOIN */.    if
5a50: 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d  ( pLoop->prereq=
5a60: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
5a70: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
5a80: 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20  M_VIRTUAL)==0.  
5a90: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
5aa0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5ab0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
5ac0: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
5ad0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45  TableConstant(pE
5ae0: 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  xpr, pSrc->iCurs
5af0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  or) ){.      pPa
5b00: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45  rtial = sqlite3E
5b10: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
5b20: 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20  b, pPartial,.   
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5b50: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
5b60: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
5b70: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
5b80: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
5b90: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
5ba0: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
5bb0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5bc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
5bd0: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
5be0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
5bf0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
5c00: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
5c10: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
5c20: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
5c30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
5c40: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
5c50: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
5c60: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
5c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5c80: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
5c90: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
5ca0: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
5cb0: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
5cc0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
5cd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
5ce0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
5cf0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
5d00: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
5d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d20: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d30: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5d40: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
5d50: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
5d60: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
5d70: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
5d80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
5d90: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
5da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5db0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
5dc0: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
5dd0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
5de0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
5df0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5e00: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
5e10: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
5e20: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
5e30: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
5e40: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
5e50: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
5e60: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
5e70: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
5e80: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
5ea0: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
5eb0: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
5ec0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
5ed0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
5ee0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
5ef0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
5f00: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
5f10: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
5f20: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
5f30: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
5f40: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
5f50: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
5f60: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
5f70: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
5f80: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
5f90: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
5fa0: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
5fb0: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
5fc0: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
5fd0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5fe0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
5ff0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
6000: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
6010: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
6020: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
6030: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
6040: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
6050: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
6060: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
6070: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
6080: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
6090: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
60a0: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
60b0: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
60c0: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
60d0: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
60e0: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
60f0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
6100: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6110: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
6120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
6130: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
6140: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6150: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
6160: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
6170: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
6180: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
6190: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
61a0: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
61b0: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
61c0: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
61d0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
61e0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
61f0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
6200: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
6210: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
6220: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
6230: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
6240: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
6250: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
6260: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
6270: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
6280: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
6290: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
62a0: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
62b0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
62c0: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
62d0: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
62e0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
62f0: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
6300: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
6310: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
6320: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
6330: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
6340: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6350: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6360: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6370: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6380: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6390: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
63a0: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
63b0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
63c0: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
63d0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
63e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
63f0: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
6400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
6410: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
6420: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
6430: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
6440: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6450: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
6460: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
6470: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
6480: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
6490: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
64a0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
64b0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
64c0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
64d0: 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20  ll[n] = pColl ? 
64e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73  pColl->zName : s
64f0: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
6500: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
6510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6520: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
6530: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
6540: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
6550: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
6560: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
6570: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
6580: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
6590: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
65a0: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
65b0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
65c0: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
65d0: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
65e0: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
65f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
6600: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
6610: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
6620: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6630: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6640: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
6650: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
6660: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
6670: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
6680: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
6690: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
66a0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
66b0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
66c0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
66d0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
66f0: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
6700: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
6710: 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[n] = XN_ROW
6720: 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  ID;.  pIdx->azCo
6730: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6740: 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20  trBINARY;..  /* 
6750: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6760: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6770: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6780: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6790: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
67a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
67b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
67c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
67d0: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
67e0: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
67f0: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6800: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6810: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6820: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
6830: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
6840: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6850: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6860: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6870: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6880: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6890: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
68a0: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
68b0: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
68c0: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
68d0: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
68e0: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
68f0: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
6900: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
6910: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
6920: 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d     addrCounter =
6930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6940: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6950: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6970: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
6980: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
6990: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
69a0: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64  illSub);.    add
69b0: 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56  rTop =  sqlite3V
69c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
69d0: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
69e0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
69f0: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
6a00: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
6a10: 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c   row of \"%s\"",
6a20: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
6a30: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  >zName));.  }els
6a40: 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  e{.    addrTop =
6a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a60: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
6a70: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6a80: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6a90: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
6aa0: 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43  artial ){.    iC
6ab0: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6ac0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6ad0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6ae0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6af0: 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e  , pPartial, iCon
6b00: 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tinue, SQLITE_JU
6b10: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
6b20: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
6b30: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
6b40: 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f  X;.  }.  regReco
6b50: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
6b60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b70: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
6b80: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
6b90: 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73  Key(.      pPars
6ba0: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
6bb0: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
6bc0: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a  ord, 0, 0, 0, 0.
6bd0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
6be0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6bf0: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
6c00: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
6c10: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6c20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c30: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c40: 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
6c50: 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
6c60: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6c70: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
6c80: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6c90: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6ca0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6cb0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
6cc0: 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73  rCounter, regBas
6cd0: 65 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  e+n);.    transl
6ce0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
6cf0: 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76  v, addrTop, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61  el->iTabCur, pTa
6d10: 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
6d20: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6d30: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
6d40: 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49  rTop);.    pTabI
6d50: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6d60: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6d70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6d80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6d90: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6da0: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
6db0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6dc0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6dd0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6de0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
6df0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
6e00: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6e10: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6e20: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6e30: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6e40: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6e50: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6e60: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6e70: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6e80: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6e90: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6ea0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
6eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
6ec0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
6ed0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
6ee0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6ef0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
6f00: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6f10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6f20: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6f30: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6f40: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6f50: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6f60: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6f70: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6f80: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6f90: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6fa0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
6fb0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
6fc0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
6fd0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
6fe0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
6ff0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
7000: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7010: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
7020: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
7030: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
7040: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
7050: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
7060: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
7070: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
7080: 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
7090: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
70a0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73   /* Ignore terms
70b0: 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72   with these prer
70c0: 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eqs */.  struct 
70d0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
70e0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
70f0: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
7100: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
7110: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
7120: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7130: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
7140: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
7150: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
7160: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
7170: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
7180: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7190: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
71a0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
71b0: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
71c0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
71d0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
71e0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
71f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
7200: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
7210: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
7220: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
7230: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
7240: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
7250: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
7260: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
7270: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
7280: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
7290: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
72a0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
72b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
72c0: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
72d0: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
72e0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
72f0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
7300: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
7310: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
7320: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
7330: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7340: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
7350: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7360: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7370: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7380: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7390: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
73a0: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
73b0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
73c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
73d0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
73e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
73f0: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
7400: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
7410: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7420: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
7430: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
7440: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7450: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
7460: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d  u.leftColumn>=(-
7470: 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  1) );.    nTerm+
7480: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
7490: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
74a0: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
74b0: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
74c0: 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
74d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
74e0: 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
74f0: 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
7500: 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
7510: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7520: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
7530: 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
7540: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
7550: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
7560: 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
7570: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
7580: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
7590: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
75a0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
75b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
75c0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
75d0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
75e0: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
75f0: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
7600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
7610: 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
7620: 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
7630: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
7640: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7650: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7660: 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
7670: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7680: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
7690: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
76a0: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
76d0: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
76e0: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
7710: 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
7720: 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
7730: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
7740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7750: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
7760: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
7770: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7780: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
7790: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
77a0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
77b0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
77c0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
77d0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
77e0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
77f0: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
7800: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
7810: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
7820: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
7830: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
7840: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
7850: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
7860: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
7870: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
7880: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
7890: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
78a0: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
78b0: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
78c0: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
78d0: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
78e0: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
78f0: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
7900: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
7910: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7920: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
7930: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
7940: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7950: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
7960: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
7970: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
7980: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
7990: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
79a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
79b0: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
79c0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
79d0: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
79e0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
79f0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
7a00: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
7a10: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
7a20: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7a30: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7a40: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
7a50: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7a60: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7ab0: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
7ac0: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
7ad0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
7ae0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
7af0: 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
7b00: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7b10: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7b20: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7b30: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7b40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7b50: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7b60: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7b70: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7b80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b90: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7ba0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7bb0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7bc0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7bd0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7be0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
7bf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7c00: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7c10: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
7c20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7c30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7c40: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
7c50: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
7c60: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
7c70: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
7c80: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
7c90: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7ca0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7cb0: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
7cc0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7cd0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
7ce0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
7cf0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
7d00: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
7d10: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
7d20: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
7d30: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
7d40: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
7d50: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7d60: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
7d70: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
7d80: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  _EQ;.    if( op=
7d90: 3d 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  =WO_MATCH ){.   
7da0: 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65     op = pTerm->e
7db0: 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20  MatchOp;.    }. 
7dc0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
7dd0: 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54  p = op;.    /* T
7de0: 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e  he direct assign
7df0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76  ment in the prev
7e00: 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73  ious line is pos
7e10: 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75  sible only becau
7e20: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f  se.    ** the WO
7e30: 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44  _ and SQLITE_IND
7e40: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63  EX_CONSTRAINT_ c
7e50: 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63  odes are identic
7e60: 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  al.  The.    ** 
7e70: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
7e80: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
7e90: 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ct. */.    asser
7ea0: 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
7eb0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
7ec0: 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  T_EQ );.    asse
7ed0: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
7ee0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
7ef0: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_LT );.    ass
7f00: 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
7f10: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7f20: 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  INT_LE );.    as
7f30: 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
7f40: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7f50: 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61  AINT_GT );.    a
7f60: 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
7f70: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7f80: 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
7f90: 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48  assert( WO_MATCH
7fa0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
7fb0: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
7fc0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7fd0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7fe0: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57  & (WO_IN|WO_EQ|W
7ff0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
8000: 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
8010: 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   );.    j++;.  }
8020: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
8030: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
8040: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
8050: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
8060: 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
8070: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
8080: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
8090: 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
80a0: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
80b0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
80c0: 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  Order;.  }..  re
80d0: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
80e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
80f0: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
8100: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
8110: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8120: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8130: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
8140: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
8150: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
8160: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
8170: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
8180: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
8190: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
81a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
81b0: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
81c0: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
81d0: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
81e0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
81f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
8200: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
8210: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
8220: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
8230: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
8240: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
8250: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
8260: 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
8270: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
8280: 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
8290: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
82a0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
82b0: 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
82c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
82d0: 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
82e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
82f0: 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
8300: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
8310: 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
8320: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
8330: 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
8340: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
8350: 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
8360: 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
8370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8380: 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
8390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
83a0: 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
83b0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
83c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
83d0: 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
83e0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
83f0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
8400: 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
8410: 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
8420: 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
8430: 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
8440: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
8450: 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
8460: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
8470: 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
8480: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
84a0: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
84b0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
84c0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
84d0: 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
84e0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
84f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8500: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
8510: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
8520: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
8530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8540: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
8550: 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
8560: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
8570: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
8580: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
8590: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
85a0: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
85b0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
85c0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
85d0: 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
85e0: 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
85f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
8600: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
8610: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8620: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8630: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
8640: 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
8650: 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
8660: 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
8670: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
8680: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8690: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
86a0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
86b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
86c0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
86d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
86e0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
86f0: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
8700: 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
8710: 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
8720: 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
8730: 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
8740: 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
8750: 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
8760: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
8770: 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
8780: 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
8790: 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
87a0: 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61   pRec.**    aSta
87b0: 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
87c0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
87d0: 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a  ual to pRec.**.*
87e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
87f0: 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65  ex of the sample
8800: 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61   that is the sma
8810: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61  llest sample tha
8820: 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
8830: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8840: 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74   pRec. Note that
8850: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   this index is n
8860: 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69  ot an index.** i
8870: 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  nto the aSample[
8880: 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20  ] array - it is 
8890: 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20  an index into a 
88a0: 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73  virtual set of s
88b0: 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20  amples.** based 
88c0: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
88d0: 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64  of aSample[] and
88e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
88f0: 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20  ields in record 
8900: 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74  .** pRec. .*/.st
8910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
8920: 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
8930: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8940: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8950: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8960: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8980: 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
8990: 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
89a0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
89b0: 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
89c0: 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
89d0: 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
89e0: 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a00: 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
8a10: 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
8a20: 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
8a30: 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
8a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8a50: 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
8a60: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
8a70: 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
8a80: 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
8a90: 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ab0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
8ac0: 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
8ad0: 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
8ae0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8b00: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61  ndex of first sa
8b10: 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a  mple >= pRec */.
8b20: 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20    int iSample;  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b40: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
8b50: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
8b60: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
8b70: 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b90: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
8ba0: 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
8bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
8be0: 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
8bf0: 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
8c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
8c10: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
8c20: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
8c30: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c50: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
8c60: 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52   in pRec */.  tR
8c70: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30  owcnt iLower = 0
8c80: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c  ;         /* anL
8c90: 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20  t[] + anEq[] of 
8ca0: 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70  largest sample p
8cb0: 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66  Rec is > */..#if
8cc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
8cd0: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
8ce0: 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
8cf0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
8d00: 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73   pRec!=0 );.  as
8d10: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
8d20: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
8d30: 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
8d40: 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c  0 && pRec->nFiel
8d50: 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  d<=pIdx->nSample
8d60: 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  Col );..  /* Do 
8d70: 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
8d80: 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  to find the firs
8d90: 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72  t sample greater
8da0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20   than or equal. 
8db0: 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20   ** to pRec. If 
8dc0: 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20  pRec contains a 
8dd0: 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68  single field, th
8de0: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
8df0: 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20   to search.  ** 
8e00: 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53  is simply the aS
8e10: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49  ample[] array. I
8e20: 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e  f the samples in
8e30: 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61   aSample[] conta
8e40: 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61  in more.  ** tha
8e50: 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c  n one fields, al
8e60: 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69  l fields followi
8e70: 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65  ng the first are
8e80: 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20   ignored..  **. 
8e90: 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74   ** If pRec cont
8ea0: 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77  ains N fields, w
8eb0: 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74  here N is more t
8ec0: 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73  han one, then as
8ed0: 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a   well as the.  *
8ee0: 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  * samples in aSa
8ef0: 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65  mple[] (truncate
8f00: 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20  d to N fields), 
8f10: 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20  the search also 
8f20: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73  has to.  ** cons
8f30: 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66  ider prefixes of
8f40: 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20   those samples. 
8f50: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
8f60: 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
8f70: 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70  es.  ** in aSamp
8f80: 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  le is:.  **.  **
8f90: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20       aSample[0] 
8fa0: 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (a, 5) .  **  
8fb0: 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20     aSample[1] = 
8fc0: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
8fd0: 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28    aSample[2] = (
8fe0: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
8ff0: 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c  aSample[3] = (c,
9000: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9010: 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c  aSample[4] = (c,
9020: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
9030: 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20  Then the search 
9040: 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65  space should ide
9050: 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70  ally be the samp
9060: 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68  les above and th
9070: 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70  e .  ** unique p
9080: 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d  refixes [a], [b]
9090: 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69   and [c]. But si
90a0: 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64  nce that is hard
90b0: 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20   to organize, . 
90c0: 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74   ** the code act
90d0: 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74  ually searches t
90e0: 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20  his set:.  **.  
90f0: 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20  **     0: (a) . 
9100: 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35   **     1: (a, 5
9110: 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28  ) .  **     2: (
9120: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
9130: 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   3: (a, 10) .  *
9140: 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20  *     4: (b) .  
9150: 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29  **     5: (b, 5)
9160: 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63   .  **     6: (c
9170: 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28  ) .  **     7: (
9180: 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
9190: 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20    8: (c, 105).  
91a0: 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30  **     9: (c, 10
91b0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  5).  **.  ** For
91c0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20   each sample in 
91d0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
91e0: 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61  ray, N samples a
91f0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
9200: 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  e.  ** effective
9210: 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49   sample array. I
9220: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d  n the above, sam
9230: 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65  ples 0 and 1 are
9240: 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20   based on .  ** 
9250: 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30  sample aSample[0
9260: 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64  ]. Samples 2 and
9270: 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d   3 on aSample[1]
9280: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
9290: 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20  Often, sample i 
92a0: 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  of each block of
92b0: 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d   N effective sam
92c0: 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66  ples has (i+1) f
92d0: 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65  ields..  ** Exce
92e0: 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20  pt, each sample 
92f0: 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20  may be extended 
9300: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  to ensure that i
9310: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9320: 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20  n or.  ** equal 
9330: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
9340: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72  sample in the ar
9350: 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ray. For example
9360: 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  , in the above, 
9370: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69  .  ** sample 2 i
9380: 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
9390: 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66  le of a block of
93a0: 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61   N samples, so a
93b0: 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a  t first it .  **
93c0: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
93d0: 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65   should be 1 fie
93e0: 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65  ld in size. Howe
93f0: 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20  ver, that would 
9400: 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d  make it .  ** sm
9410: 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  aller than sampl
9420: 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61  e 1, so the bina
9430: 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20  ry search would 
9440: 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72  not work. As a r
9450: 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20  esult, .  ** it 
9460: 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74  is extended to t
9470: 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64  wo fields. The d
9480: 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74  uplicates that t
9490: 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e  his creates do n
94a0: 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61  ot .  ** cause a
94b0: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
94c0: 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65  /.  nField = pRe
94d0: 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f  c->nField;.  iCo
94e0: 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65  l = 0;.  iSample
94f0: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
9500: 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b   * nField;.  do{
9510: 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20  .    int iSamp; 
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
9540: 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74  Sample[] of test
9550: 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69   sample */.    i
9560: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9580: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9590: 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20   in test sample 
95a0: 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20  */..    iTest = 
95b0: 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32  (iMin+iSample)/2
95c0: 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54  ;.    iSamp = iT
95d0: 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20  est / nField;.  
95e0: 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b    if( iSamp>0 ){
95f0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  .      /* The pr
9600: 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65  oposed effective
9610: 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65   sample is a pre
9620: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53  fix of sample aS
9630: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20  ample[iSamp]..  
9640: 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61      ** Specifica
9650: 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73  lly, the shortes
9660: 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c  t prefix of at l
9670: 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25  east (1 + iTest%
9680: 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a  nField) .      *
9690: 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73  * fields that is
96a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
96b0: 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63  e previous effec
96c0: 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f  tive sample.  */
96d0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54  .      for(n=(iT
96e0: 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20  est % nField) + 
96f0: 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b  1; n<nField; n++
9700: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9710: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e  Sample[iSamp-1].
9720: 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70  anLt[n-1]!=aSamp
9730: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9740: 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  -1] ) break;.   
9750: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9760: 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20        n = iTest 
9770: 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  + 1;.    }..    
9780: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9790: 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
97a0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
97b0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61  pare(aSample[iSa
97c0: 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  mp].n, aSample[i
97d0: 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Samp].p, pRec);.
97e0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
97f0: 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
9800: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
9810: 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70  nLt[n-1] + aSamp
9820: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e  le[iSamp].anEq[n
9830: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9840: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
9850: 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20  else if( res==0 
9860: 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20  && n<nField ){. 
9870: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9880: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9890: 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  t[n-1];.      iM
98a0: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
98b0: 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20      res = -1;.  
98c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
98d0: 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a  Sample = iTest;.
98e0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31        iCol = n-1
98f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
9900: 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53  ( res && iMin<iS
9910: 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69  ample );.  i = i
9920: 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b  Sample / nField;
9930: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9940: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
9950: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
9960: 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
9970: 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
9980: 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
9990: 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
99a0: 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
99b0: 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
99c0: 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
99d0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
99e0: 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
99f0: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  ts.  */.  if( pP
9a00: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9a10: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
9a20: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
9a30: 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d       /* If (res=
9a40: 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65  =0) is true, the
9a50: 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65  n pRec must be e
9a60: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
9a70: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
9a80: 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
9a90: 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  le );.      asse
9aa0: 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64  rt( iCol==nField
9ab0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  -1 );.      pRec
9ac0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
9ad0: 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  d;.      assert(
9ae0: 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
9af0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
9b00: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
9b10: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a  le[i].p, pRec) .
9b20: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
9b30: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9b40: 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b  Failed .      );
9b50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9b60: 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70    /* Unless i==p
9b70: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e  Idx->nSample, in
9b80: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52  dicating that pR
9b90: 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ec is larger tha
9ba0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73  n.      ** all s
9bb0: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53  amples in the aS
9bc0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70  ample[] array, p
9bd0: 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c  Rec must be smal
9be0: 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ler than the.   
9bf0: 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66     ** (iCol+1) f
9c00: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
9c10: 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20  ample i.  */.   
9c20: 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49     assert( i<=pI
9c30: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69  dx->nSample && i
9c40: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  >=0 );.      pRe
9c50: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
9c60: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
9c70: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
9c80: 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  le .           |
9c90: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
9ca0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9cb0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
9cc0: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20  [i].p, pRec)>0. 
9cd0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
9ce0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9cf0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20  ailed );..      
9d00: 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69  /* if i==0 and i
9d10: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63  Col==0, then rec
9d20: 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c  ord pRec is smal
9d30: 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ler than all sam
9d40: 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ples.      ** in
9d50: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9d60: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
9d70: 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65   if (iCol>0) the
9d80: 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20  n pRec must.    
9d90: 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20    ** be greater 
9da0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9db0: 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c   the (iCol) fiel
9dc0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
9dd0: 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49  le i..      ** I
9de0: 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52  f (i>0), then pR
9df0: 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ec must also be 
9e00: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d  greater than sam
9e10: 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20  ple (i-1).  */. 
9e20: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
9e30: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
9e40: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a  >nField = iCol;.
9e50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9e60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9e70: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9e80: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9e90: 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20  ].p, pRec)<=0.  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
9eb0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9ec0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9ed0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  }.      if( i>0 
9ee0: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
9ef0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
9f00: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9f10: 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
9f20: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9f30: 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
9f40: 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
9f50: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <0.             
9f60: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
9f70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9f80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9f90: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
9fa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9fb0: 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
9fc0: 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
9fd0: 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f  pRec is equal to
9fe0: 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20   sample i */.   
9ff0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
a000: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61  Field-1 );.    a
a010: 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
a020: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a030: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a040: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
a050: 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
a060: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
a070: 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b  oint, the (iCol+
a080: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a090: 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  of aSample[i] is
a0a0: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
a0b0: 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  ** sample that i
a0c0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  s greater than p
a0d0: 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70  Rec. Or, if i==p
a0e0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65  Idx->nSample the
a0f0: 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73  n pRec.    ** is
a100: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
a110: 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
a120: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52  array. */.    tR
a130: 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47  owcnt iUpper, iG
a140: 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70  ap;.    if( i>=p
a150: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  Idx->nSample ){.
a160: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73        iUpper = s
a170: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
a180: 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
a190: 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Est[0]);.    }el
a1a0: 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
a1b0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
a1c0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  Lt[iCol];.    }.
a1d0: 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
a1e0: 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
a1f0: 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
a200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
a210: 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
a220: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
a230: 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
a240: 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
a250: 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
a260: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
a270: 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
a280: 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
a290: 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53  r + iGap;.    aS
a2a0: 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
a2b0: 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d  AvgEq[iCol];.  }
a2c0: 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
a2d0: 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20  he pRec->nField 
a2e0: 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
a2f0: 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52  urning.  */.  pR
a300: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
a310: 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  eld;.  return i;
a320: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* 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 20 2a 2f 0a 0a 2f 2a  _OR_STAT4 */../*
a350: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
a360: 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20   NULL, pTerm is 
a370: 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76  a term that prov
a380: 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72  ides an upper or
a390: 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20   lower.** bound 
a3a0: 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e  on a range scan.
a3b0: 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65   Without conside
a3c0: 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69  ring pTerm, it i
a3d0: 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20  s estimated .** 
a3e0: 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
a3f0: 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f  ll visit nNew ro
a400: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
a410: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
a420: 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65  mber.** estimate
a430: 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
a440: 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65  after taking pTe
a450: 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e  rm into account.
a460: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
a470: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  er explicitly sp
a480: 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69  ecified a likeli
a490: 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72  hood() value for
a4a0: 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74   this term,.** t
a4b0: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
a4c0: 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65  alue is the like
a4d0: 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65  lihood multiplie
a4e0: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
a4f0: 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73  of.** input rows
a500: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  . Otherwise, thi
a510: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
a520: 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e  es that an "IS N
a530: 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a  OT NULL" term.**
a540: 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f   has a likelihoo
a550: 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61  d of 0.50, and a
a560: 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20  ny other term a 
a570: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e  likelihood of 0.
a580: 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  25..*/.static Lo
a590: 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41  gEst whereRangeA
a5a0: 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20  djust(WhereTerm 
a5b0: 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e  *pTerm, LogEst n
a5c0: 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e  New){.  LogEst n
a5d0: 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66  Ret = nNew;.  if
a5e0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69  ( pTerm ){.    i
a5f0: 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
a600: 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
a610: 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nRet += pTerm->t
a620: 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65  ruthProb;.    }e
a630: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
a640: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
a650: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
a660: 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20    nRet -= 20;   
a670: 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d       assert( 20=
a680: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
a690: 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) );.    }.  }. 
a6a0: 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
a6b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a6c0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
a6d0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75  STAT4./*.** Retu
a6e0: 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  rn the affinity 
a6f0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  for a single col
a700: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  umn of an index.
a710: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a720: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
a730: 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74  mnAffinity(sqlit
a740: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
a750: 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  Idx, int iCol){.
a760: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
a770: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
a780: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
a790: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
a7a0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
a7b0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
a7c0: 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20  tr(db, pIdx)==0 
a7d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a7e0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
a7f0: 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f  return pIdx->zCo
a800: 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65  lAff[iCol];.}.#e
a810: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
a820: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
a830: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a  3_OR_STAT4./* .*
a840: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a850: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74  is called to est
a860: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
a870: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
a880: 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73   by a.** range-s
a890: 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63  can on a skip-sc
a8a0: 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  an index. For ex
a8b0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ample:.**.**   C
a8c0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
a8d0: 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a  N t1(a, b, c);.*
a8e0: 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
a8f0: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
a900: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41  ND c BETWEEN ? A
a910: 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ND ?;.**.** Valu
a920: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73  e pLoop->nOut is
a930: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
a940: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
a950: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
a960: 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73  ** visited for s
a970: 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44  canning (a=? AND
a980: 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63   b=?). This func
a990: 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61  tion reduces tha
a9a0: 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62  t estimate .** b
a9b0: 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f  y some factor to
a9c0: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
a9d0: 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e   (c BETWEEN ? AN
a9e0: 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20  D ?) expression 
a9f0: 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
aa00: 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74  stat4 data for t
aa10: 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73  he index. this s
aa20: 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f  can will be pefo
aa30: 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  rmed multiple .*
aa40: 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f  * times (once fo
aa50: 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d  r each (a,b) com
aa60: 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  bination that ma
aa70: 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65  tches a=?) is de
aa80: 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20  alt with .** by 
aa90: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
aaa0: 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62  * It does this b
aab0: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  y scanning throu
aac0: 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d  gh all stat4 sam
aad0: 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20  ples, comparing 
aae0: 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63  values.** extrac
aaf0: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
ab00: 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20  and pUpper with 
ab10: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
ab20: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68  g column in each
ab30: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c  .** sample. If L
ab40: 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e   and U are the n
ab50: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
ab60: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73   found to be les
ab70: 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75  s than or.** equ
ab80: 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  al to the values
ab90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
aba0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
abb0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  r respectively, 
abc0: 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  and.** N is the 
abd0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
abe0: 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f  samples, the pLo
abf0: 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69  op->nOut value i
ac00: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73  s adjusted.** as
ac10: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ac20: 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20    nOut = nOut * 
ac30: 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20  ( min(U - L, 1) 
ac40: 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70  / N ).**.** If p
ac50: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Lower is NULL, o
ac60: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
ac70: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
ac80: 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69  om the term, L i
ac90: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f  s.** set to zero
aca0: 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e  . If pUpper is N
acb0: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
acc0: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
acd0: 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20  ted from it,.** 
ace0: 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a  U is set to N..*
acf0: 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  *.** Normally, t
ad00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
ad10: 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62  s *pbDone to 1 b
ad20: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
ad30: 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
ad40: 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  no value can be 
ad50: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65  extracted from e
ad60: 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20  ither pLower or 
ad70: 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74  pUpper (and so t
ad80: 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f  he.** estimate o
ad90: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
ada0: 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72  rows delivered r
adb0: 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
adc0: 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73  ), *pbDone.** is
add0: 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a   left as is..**.
ade0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
adf0: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
ae00: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
ae10: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
ae20: 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  se, .** SQLITE_O
ae30: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
ae40: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
ae50: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
ae60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
ae70: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
ae80: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
ae90: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
aea0: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
aeb0: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
aec0: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
aed0: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
aee0: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
aef0: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
af00: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
af10: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
af20: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
af30: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
af40: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
af50: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e  /* Update the .n
af60: 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69  Out value of thi
af70: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
af80: 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20  *pbDone         
af90: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
afa0: 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
afb0: 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72  expr. value extr
afc0: 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e  acted */.){.  In
afd0: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
afe0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
aff0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
b000: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
b010: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b020: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
b030: 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20  t nLower = -1;. 
b040: 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d   int nUpper = p-
b050: 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e  >nSample+1;.  in
b060: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b070: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c  ;.  u8 aff = sql
b080: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
b090: 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e  ffinity(db, p, n
b0a0: 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Eq);.  CollSeq *
b0b0: 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69  pColl;.  .  sqli
b0c0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20  te3_value *p1 = 
b0d0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
b0e0: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
b0f0: 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20  rom pLower */.  
b100: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
b110: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
b120: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
b130: 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a  ed from pUpper *
b140: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
b150: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  e *pVal = 0;    
b160: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
b170: 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f  racted from reco
b180: 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d  rd */..  pColl =
b190: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
b1a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
b1b0: 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20  >azColl[nEq]);. 
b1c0: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
b1d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b1e0: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b1f0: 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  r(pParse, pLower
b200: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b210: 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20   aff, &p1);.    
b220: 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  nLower = 0;.  }.
b230: 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20    if( pUpper && 
b240: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b250: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b260: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
b270: 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70  xpr(pParse, pUpp
b280: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
b290: 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20  t, aff, &p2);.  
b2a0: 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20    nUpper = p2 ? 
b2b0: 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a  0 : p->nSample;.
b2c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c    }..  if( p1 ||
b2d0: 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   p2 ){.    int i
b2e0: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b  ;.    int nDiff;
b2f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
b300: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
b310: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
b320: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b330: 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e  lite3Stat4Column
b340: 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  (db, p->aSample[
b350: 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  i].p, p->aSample
b360: 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61  [i].n, nEq, &pVa
b370: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
b380: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
b390: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
b3a0: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
b3b0: 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61  mCompare(p1, pVa
b3c0: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
b3d0: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
b3e0: 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nLower++;.      
b3f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
b400: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20  SQLITE_OK && p2 
b410: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b420: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b430: 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c  ompare(p2, pVal,
b440: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b450: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55   if( res>=0 ) nU
b460: 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pper++;.      }.
b470: 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20      }.    nDiff 
b480: 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77  = (nUpper - nLow
b490: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  er);.    if( nDi
b4a0: 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20  ff<=0 ) nDiff = 
b4b0: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  1;..    /* If th
b4c0: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
b4d0: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62  pper and lower b
b4e0: 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20  ound specified, 
b4f0: 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
b500: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69  comparisons indi
b510: 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61  cate that they a
b520: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
b530: 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62  r, use the fallb
b540: 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  ack.    ** metho
b550: 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74  d (assume that t
b560: 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31  he scan visits 1
b570: 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29  /64 of the rows)
b580: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
b590: 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65      ** the numbe
b5a0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
b5b0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73  d. Otherwise, es
b5c0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
b5d0: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
b5e0: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f   using the metho
b5f0: 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  d described in t
b600: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
b610: 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  t for this funct
b620: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
b630: 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70  nDiff!=1 || pUpp
b640: 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d  er==0 || pLower=
b650: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
b660: 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74  nAdjust = (sqlit
b670: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d  e3LogEst(p->nSam
b680: 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f  ple) - sqlite3Lo
b690: 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20  gEst(nDiff));.  
b6a0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
b6b0: 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20  -= nAdjust;.    
b6c0: 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20    *pbDone = 1;. 
b6d0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
b6e0: 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b  0x10, ("range sk
b6f0: 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ip-scan regions:
b700: 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d   %u..%u  adjust=
b710: 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  %d est=%d\n",.  
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c           nLower,
b740: 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74   nUpper, nAdjust
b750: 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  *-1, pLoop->nOut
b760: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  ));.    }..  }el
b770: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
b780: 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  *pbDone==0 );.  
b790: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
b7a0: 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  eFree(p1);.  sql
b7b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32  ite3ValueFree(p2
b7c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
b7d0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
b7e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
b7f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
b800: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b810: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  AT4 */../*.** Th
b820: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
b830: 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
b840: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b850: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
b860: 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
b870: 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
b880: 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
b890: 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
b8a0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
b8b0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
b8c0: 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
b8d0: 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
b8e0: 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
b8f0: 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
b900: 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
b910: 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
b920: 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
b930: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
b940: 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
b950: 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
b960: 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
b970: 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
b980: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
b990: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
b9a0: 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
b9c0: 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
b9d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
b9e0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
b9f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
ba00: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
ba10: 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
ba20: 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
ba30: 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
ba40: 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
ba50: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
ba60: 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
ba70: 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
ba80: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
ba90: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
baa0: 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69  e value in (pBui
bab0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
bac0: 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20  ree.nEq) is the 
bad0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
bae0: 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
baf0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
bb00: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
bb10: 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
bb20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
bb30: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
bb40: 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
bb50: 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
bb60: 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
bb70: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
bb80: 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
bb90: 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
bba0: 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
bbb0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
bbc0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
bbd0: 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
bbe0: 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
bbf0: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
bc00: 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
bc10: 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
bc20: 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
bc30: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
bc40: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
bc50: 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
bc60: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
bc70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
bc80: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
bc90: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
bca0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
bcb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
bcc0: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
bcd0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
bce0: 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
bcf0: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
bd00: 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
bd10: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
bd20: 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
bd30: 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
bd40: 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
bd50: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
bd60: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
bd70: 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
bd80: 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69  0, then *pnOut i
bd90: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
bda0: 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
bdb0: 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
bdc0: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
bdd0: 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
bde0: 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
bdf0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
be00: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
be10: 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
be20: 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
be30: 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
be40: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
be50: 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
be60: 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
be70: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
be80: 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69  a single range i
be90: 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
bea0: 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
beb0: 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
bec0: 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70  f 4. .** and a p
bed0: 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  air of constrain
bee0: 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  ts (x>? AND x<?)
bef0: 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70   reduces the exp
bf00: 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a  ected number of.
bf10: 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  ** rows visited 
bf20: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36  by a factor of 6
bf30: 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  4..*/.static int
bf40: 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
bf50: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
bf60: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
bf70: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
bf80: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
bf90: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
bfa0: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
bfb0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
bfc0: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
bfd0: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
bfe0: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
bff0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c000: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c010: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
c020: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c030: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
c040: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c050: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
c060: 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64  pLoop     /* Mod
c070: 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e  ify the .nOut an
c080: 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69  d maybe .rRun fi
c090: 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  elds */.){.  int
c0a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c0b0: 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c  .  int nOut = pL
c0c0: 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67  oop->nOut;.  Log
c0d0: 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  Est nNew;..#ifde
c0e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c0f0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
c100: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
c110: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
c120: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
c130: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
c140: 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61  q;..  if( p->nSa
c150: 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d  mple>0 && nEq<p-
c160: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20  >nSampleCol ){. 
c170: 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
c180: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
c190: 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
c1a0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
c1b0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
c1c0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
c1d0: 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66  2];.      u8 aff
c1e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ;..      /* Vari
c1f0: 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c  able iLower will
c200: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
c210: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
c220: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
c230: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69   .      ** the i
c240: 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65  ndex that are le
c250: 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65  ss than the lowe
c260: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
c270: 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a  ange query. The.
c280: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62        ** lower b
c290: 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63  ound being the c
c2a0: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
c2b0: 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65  $P and $L, where
c2c0: 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20   $P is the.     
c2d0: 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
c2e0: 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
c2f0: 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
c300: 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
c310: 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20  left-most.      
c320: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ** columns of th
c330: 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20  e index, and $L 
c340: 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  is the value in 
c350: 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a  pLower..      **
c360: 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  .      ** Or, if
c370: 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20   pLower is NULL 
c380: 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20  or $L cannot be 
c390: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
c3a0: 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20  t (because it.  
c3b0: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20      ** is not a 
c3c0: 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20  simple variable 
c3d0: 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  or literal value
c3e0: 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  ), the lower bou
c3f0: 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  nd of the.      
c400: 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20  ** range is $P. 
c410: 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69  Due to a quirk i
c420: 6e 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b  n the way whereK
c430: 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c  eyStats() works,
c440: 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   even.      ** i
c450: 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c  f $L is availabl
c460: 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  e, whereKeyStats
c470: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
c480: 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a   both ($P) and .
c490: 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29        ** ($P:$L)
c4a0: 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20   and the larger 
c4b0: 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72  of the two retur
c4c0: 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73  ned values is us
c4d0: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
c4e0: 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
c4f0: 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65   iUpper is to be
c500: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
c510: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
c520: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20  er of rows.     
c530: 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
c540: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
c550: 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79   the range query
c560: 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65  . Where the uppe
c570: 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a  r bound.      **
c580: 20 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20   is either ($P) 
c590: 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69  or ($P:$U). Agai
c5a0: 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73  n, even if $U is
c5b0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68   available, both
c5c0: 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
c5d0: 20 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72   of iUpper are r
c5e0: 65 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72  equested of wher
c5f0: 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20  eKeyStats() and 
c600: 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64  the smaller used
c610: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c620: 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   ** The number o
c630: 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74  f rows between t
c640: 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73  he two bounds is
c650: 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65   then just iUppe
c660: 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  r-iLower..      
c670: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
c680: 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20   iLower;     /* 
c690: 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74  Rows less than t
c6a0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a  he lower bound *
c6b0: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
c6c0: 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52  iUpper;     /* R
c6d0: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
c6e0: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f  e upper bound */
c6f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49  .      int iLwrI
c700: 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53  dx = -2;   /* aS
c710: 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
c720: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  lower bound */. 
c730: 20 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78       int iUprIdx
c740: 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d   = -1;   /* aSam
c750: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70  ple[] for the up
c760: 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20  per bound */..  
c770: 20 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a      if( pRec ){.
c780: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c790: 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d  ( pRec->nField!=
c7a0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
c7b0: 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lid );.        p
c7c0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42  Rec->nField = pB
c7d0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
c7e0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c7f0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e   aff = sqlite3In
c800: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
c810: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c  y(pParse->db, p,
c820: 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73   nEq);.      ass
c830: 65 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65  ert( nEq!=p->nKe
c840: 79 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  yCol || aff==SQL
c850: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c860: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65  );.      /* Dete
c870: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
c880: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
c890: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
c8a0: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
c8b0: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
c8c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
c8d0: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
c8e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c8f0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
c900: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
c910: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
c920: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
c930: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
c940: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
c950: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
c960: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
c970: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
c980: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
c990: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
c9a0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
c9b0: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
c9c0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
c9d0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
c9e0: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
c9f0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ca00: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
ca10: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
ca20: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
ca30: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
ca40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
ca50: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
ca60: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
ca70: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
ca80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
ca90: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
caa0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
cab0: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
cac0: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
cad0: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
cae0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
caf0: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
cb00: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
cb10: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
cb20: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
cb30: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
cb40: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
cb50: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
cb60: 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20  e on the iLower 
cb70: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
cb80: 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$L). */.     
cb90: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
cba0: 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20         int bOk; 
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61     /* True if va
cbd0: 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64  lue is extracted
cbe0: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
cbf0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
cc00: 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
cc10: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
cc20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cc30: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
cc40: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
cc50: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
cc60: 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
cc70: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
cc80: 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
cc90: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
cca0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
ccb0: 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65     iLwrIdx = whe
ccc0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
ccd0: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
cce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
ccf0: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
cd00: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
cd10: 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20   (WO_GT|WO_LE)) 
cd20: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
cd30: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
cd40: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
cd50: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
cd60: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
cd70: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
cd80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd90: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
cda0: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
cdb0: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
cdc0: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
cdd0: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
cde0: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
cdf0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
ce20: 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
ce30: 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
ce40: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
ce50: 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
ce60: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
ce70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
ce80: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
ce90: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
cea0: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
ceb0: 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
cec0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ced0: 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
cee0: 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e            tRowcn
cef0: 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
cf00: 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72    iUprIdx = wher
cf10: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
cf20: 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
cf30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
cf40: 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70   = a[0] + ((pUpp
cf50: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
cf60: 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f  (WO_GT|WO_LE)) ?
cf70: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
cf80: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69        if( iNew<i
cf90: 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
cfa0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cfb0: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
cfc0: 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20     pUpper = 0;. 
cfd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cfe0: 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  ..      pBuilder
cff0: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
d000: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d020: 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
d030: 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wer ){.         
d040: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c   nNew = sqlite3L
d050: 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69  ogEst(iUpper - i
d060: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
d070: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66    /* TUNING:  If
d080: 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64   both iUpper and
d090: 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69   iLower are deri
d0a0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ved from the sam
d0b0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
d0c0: 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75  ample, then assu
d0d0: 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d  me they are 4x m
d0e0: 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20  ore selective.  
d0f0: 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20  This brings.    
d100: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74        ** the est
d110: 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69  imated selectivi
d120: 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20  ty more in line 
d130: 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75  with what it wou
d140: 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  ld be.          
d150: 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20  ** if estimated 
d160: 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20  without the use 
d170: 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65  of STAT3/4 table
d180: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
d190: 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70  if( iLwrIdx==iUp
d1a0: 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32  rIdx ) nNew -= 2
d1b0: 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
d1c0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
d1d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
d1e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  e{.          nNe
d1f0: 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
d200: 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
d210: 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
d220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d230: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
d240: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
d250: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20   = nNew;.       
d260: 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
d270: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54  TRACE(0x10, ("ST
d280: 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20  AT4 range scan: 
d290: 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
d2a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
d2c0: 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
d2d0: 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
d2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d2f0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f  e{.      int bDo
d300: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ne = 0;.      rc
d310: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69   = whereRangeSki
d320: 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  pScanEst(pParse,
d330: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c   pLower, pUpper,
d340: 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b   pLoop, &bDone);
d350: 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65  .      if( bDone
d360: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d370: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
d380: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d390: 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
d3a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75  ED_PARAMETER(pBu
d3b0: 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74  ilder);.  assert
d3c0: 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
d3d0: 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  er );.#endif.  a
d3e0: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
d3f0: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46   || (pUpper->wtF
d400: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
d410: 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20  L)==0 );.  nNew 
d420: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
d430: 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29  st(pLower, nOut)
d440: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
d450: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70  RangeAdjust(pUpp
d460: 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a  er, nNew);..  /*
d470: 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
d480: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
d490: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d  er and lower lim
d4a0: 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c  it and neither l
d4b0: 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e  imit.  ** has an
d4c0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
d4d0: 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ined likelihood(
d4e0: 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61  ), assume the ra
d4f0: 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75  nge is.  ** redu
d500: 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69  ced by an additi
d510: 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d  onal 75%. This m
d520: 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65  eans that, by de
d530: 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65  fault, an open-e
d540: 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20  nded.  ** range 
d550: 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20  query (e.g. col 
d560: 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20  > ?) is assumed 
d570: 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20  to match 1/4 of 
d580: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  the rows in the.
d590: 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c    ** index. Whil
d5a0: 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65  e a closed range
d5b0: 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45   (e.g. col BETWE
d5c0: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65  EN ? AND ?) is e
d5d0: 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a  stimated to.  **
d5e0: 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74   match 1/64 of t
d5f0: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20  he index. */ .  
d600: 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c  if( pLower && pL
d610: 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  ower->truthProb>
d620: 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70  0 && pUpper && p
d630: 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Upper->truthProb
d640: 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  >0 ){.    nNew -
d650: 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75  = 20;.  }..  nOu
d660: 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
d670: 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
d680: 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
d690: 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
d6a0: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
d6b0: 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65  t = nNew;.#if de
d6c0: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
d6d0: 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
d6e0: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  pLoop->nOut>nOut
d6f0: 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
d700: 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20  CE(0x10,("Range 
d710: 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74  scan lowers nOut
d720: 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e   from %d to %d\n
d730: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d740: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
d750: 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a  ut, nOut));.  }.
d760: 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e  #endif.  pLoop->
d770: 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
d780: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
d790: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
d7a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
d7b0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
d7c0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
d7d0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
d7e0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
d7f0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
d800: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
d810: 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
d820: 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
d830: 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
d840: 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
d850: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
d860: 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
d870: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
d880: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
d890: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
d8a0: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
d8b0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
d8c0: 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
d8d0: 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
d8e0: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
d8f0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
d900: 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
d910: 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
d920: 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
d930: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
d940: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
d950: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
d960: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
d970: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
d980: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
d990: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
d9a0: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
d9b0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
d9c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d9d0: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
d9e0: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
d9f0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
da00: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
da10: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
da20: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
da30: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
da40: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
da50: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
da60: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
da70: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
da80: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
da90: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
daa0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
dab0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
dac0: 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
dad0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
dae0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
daf0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
db00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
db10: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
db20: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20  Builder,.  Expr 
db30: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
db40: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
db50: 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
db60: 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
db70: 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  t */.  tRowcnt *
db80: 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
db90: 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
dba0: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
dbb0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
dbc0: 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
dbd0: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
dbe0: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
dbf0: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
dc00: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
dc10: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
dc20: 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
dc30: 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66  ->pRec;.  u8 aff
dc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc50: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66      /* Column af
dc60: 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20  finity */.  int 
dc70: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
dc80: 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63        /* Subfunc
dc90: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
dca0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b   */.  tRowcnt a[
dcb0: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
dcc0: 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f  /* Statistics */
dcd0: 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61  .  int bOk;..  a
dce0: 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b  ssert( nEq>=1 );
dcf0: 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d  .  assert( nEq<=
dd00: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  p->nColumn );.  
dd10: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
dd20: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
dd30: 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
dd40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  );.  assert( pBu
dd50: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
dd60: 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  <nEq );..  /* If
dd70: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
dd80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
dd90: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
dda0: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66  index to the lef
ddb0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  t.  ** of this o
ddc0: 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20  ne, no estimate 
ddd0: 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74  can be made. Ret
dde0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
ddf0: 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42  UND. */.  if( pB
de00: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
de10: 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20  d<(nEq-1) ){.   
de20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de30: 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20  OTFOUND;.  }..  
de40: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  /* This is an op
de50: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
de60: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
de70: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
de80: 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65  tValue().  ** be
de90: 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  low would return
dea0: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
deb0: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d    */.  if( nEq>=
dec0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  p->nColumn ){.  
ded0: 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20    *pnRow = 1;.  
dee0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
def0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d  OK;.  }..  aff =
df00: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
df10: 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72  umnAffinity(pPar
df20: 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31  se->db, p, nEq-1
df30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
df40: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
df50: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
df60: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
df70: 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a  , nEq-1, &bOk);.
df80: 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
df90: 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72   = pRec;.  if( r
dfa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
dfb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
dfc0: 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  bOk==0 ) return 
dfd0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
dfe0: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  .  pBuilder->nRe
dff0: 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20  cValid = nEq;.. 
e000: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
e010: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
e020: 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52  0, a);.  WHERETR
e030: 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c  ACE(0x10,("equal
e040: 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  ity scan regions
e050: 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b  : %d\n", (int)a[
e060: 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d  1]));.  *pnRow =
e070: 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75   a[1];.  .  retu
e080: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e090: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
e0a0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
e0b0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
e0c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e0d0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
e0e0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
e0f0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
e100: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
e110: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
e120: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
e130: 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
e140: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
e150: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
e160: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
e170: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
e180: 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
e190: 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
e1a0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
e1b0: 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
e1c0: 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
e1d0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
e1e0: 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
e1f0: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
e200: 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
e210: 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
e220: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
e230: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
e240: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
e250: 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
e260: 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
e270: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
e280: 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
e290: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
e2a0: 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
e2b0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
e2c0: 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
e2d0: 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
e2e0: 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
e2f0: 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
e300: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
e310: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
e320: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
e330: 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
e340: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e350: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
e360: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
e370: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
e380: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
e390: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
e3a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e3b0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c  ,     /* The val
e3c0: 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52  ue list on the R
e3d0: 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c  HS of "x IN (v1,
e3e0: 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20  v2,v3,...)" */. 
e3f0: 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
e400: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
e410: 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
e420: 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
e430: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
e440: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
e450: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
e460: 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
e470: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
e480: 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  (p->aiRowLogEst[
e490: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  0]);.  int nRecV
e4a0: 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
e4b0: 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
e4c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4d0: 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
e4e0: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
e4f0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
e500: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
e510: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
e520: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
e530: 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
e540: 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
e550: 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
e560: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
e570: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e5a0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e5b0: 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
e5c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
e5d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
e5e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
e5f0: 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52  ){.    nEst = nR
e600: 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ow0;.    rc = wh
e610: 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
e620: 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
e630: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
e640: 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20  xpr, &nEst);.   
e650: 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74   nRowEst += nEst
e660: 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
e670: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
e680: 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66  Valid;.  }..  if
e690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e6a0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  ){.    if( nRowE
e6b0: 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f  st > nRow0 ) nRo
e6c0: 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  wEst = nRow0;.  
e6d0: 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
e6e0: 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
e6f0: 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77  CE(0x10,("IN row
e700: 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
e710: 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  d\n", nRowEst));
e720: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e730: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e740: 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
e750: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e760: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e770: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
e780: 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64  _STAT4 */...#ifd
e790: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
e7a0: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
e7b0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
e7c0: 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a   a WhereTerm obj
e7d0: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
e7e0: 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e  id whereTermPrin
e7f0: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
e800: 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a  rm, int iTerm){.
e810: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
e820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
e830: 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
e840: 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65  -3d NULL\n", iTe
e850: 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rm);.  }else{.  
e860: 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
e870: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
e880: 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
e890: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
e8a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
e8b0: 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
e8c0: 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
e8d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
e8e0: 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
e8f0: 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
e900: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
e910: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
e920: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
e930: 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
e940: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
e950: 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
e960: 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25   "TERM-%-3d %p %
e970: 73 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72  s cursor=%-3d pr
e980: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
e990: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
e9a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
e9b0: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
e9c0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
e9d0: 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  or, pTerm->truth
e9e0: 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65  Prob,.       pTe
e9f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70  rm->eOperator, p
ea00: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a  Term->wtFlags);.
ea10: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
ea20: 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d  iewExpr(0, pTerm
ea30: 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->pExpr, 0);.  }
ea40: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
ea50: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
ea60: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
ea70: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
ea80: 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
ea90: 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
eaa0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
eab0: 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
eac0: 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
ead0: 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
eae0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
eaf0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
eb00: 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
eb10: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
eb20: 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74  c+7)/8;.  struct
eb30: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
eb40: 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
eb50: 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
eb60: 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
eb70: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
eb80: 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  b;.  sqlite3Debu
eb90: 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
eba0: 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
ebb0: 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
ebd0: 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
ebe0: 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
ebf0: 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  req);.  sqlite3D
ec00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
ec10: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
ec20: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
ec30: 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
ec40: 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
ec50: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
ec60: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
ec70: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
ec80: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
ec90: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
eca0: 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
ecb0: 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20  Index && (zName 
ecc0: 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
ecd0: 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  dex->zName)!=0 )
ece0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
ecf0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
ed00: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
ed10: 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
ed20: 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
ed30: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ed40: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
ed50: 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
ed60: 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
ed70: 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
ed80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ed90: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
eda0: 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
edb0: 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
edc0: 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
edd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
ede0: 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
edf0: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
ee00: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
ee10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
ee20: 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
ee30: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
ee40: 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
ee50: 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
ee60: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
ee70: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
ee80: 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
ee90: 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
eea0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eeb0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
eec0: 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
eed0: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
eee0: 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
eef0: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
ef00: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ef10: 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
ef20: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
ef30: 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69  free(z);.  }.  i
ef40: 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
ef50: 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29  WHERE_SKIPSCAN )
ef60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
ef70: 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
ef80: 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46  x %d-%d", p->wsF
ef90: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c  lags, p->nLTerm,
efa0: 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c  p->nSkip);.  }el
efb0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
efc0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
efd0: 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  05x N %d", p->ws
efe0: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
eff0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
f000: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
f010: 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
f020: 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
f030: 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20  un, p->nOut);.  
f040: 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
f050: 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
f060: 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
f070: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f090: 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nLTerm; i++){.  
f0a0: 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
f0b0: 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c  nt(p->aLTerm[i],
f0c0: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
f0d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
f0e0: 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
f0f0: 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
f100: 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
f110: 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
f120: 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
f130: 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
f140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f150: 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
f160: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
f170: 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
f180: 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
f190: 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
f1a0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
f1b0: 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
f1c0: 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
f1d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
f1e0: 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
f1f0: 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
f200: 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
f210: 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
f220: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f230: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
f240: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f250: 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
f260: 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
f270: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
f280: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
f290: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
f2a0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
f2b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
f2c0: 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
f2d0: 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
f2e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
f2f0: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
f300: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
f310: 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
f320: 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
f330: 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
f340: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
f350: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
f360: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
f370: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f380: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
f390: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f3a0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f3b0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
f3c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f3d0: 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
f3e0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
f3f0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
f400: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
f410: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
f420: 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
f430: 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
f440: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
f450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f460: 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
f470: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f480: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f490: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
f4a0: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
f4b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
f4c0: 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
f4d0: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
f4e0: 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
f4f0: 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
f500: 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
f510: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
f520: 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
f530: 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
f540: 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
f550: 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
f560: 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
f570: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
f580: 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
f590: 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
f5a0: 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
f5b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f5c0: 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
f5d0: 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
f5e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
f5f0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  wNN(db, sizeof(p
f600: 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
f610: 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
f620: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f630: 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
f640: 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
f650: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
f660: 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
f670: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
f680: 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
f690: 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
f6a0: 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
f6b0: 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
f6c0: 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
f6d0: 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
f6e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f6f0: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
f700: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
f710: 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
f720: 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
f730: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
f740: 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
f750: 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
f760: 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
f770: 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65  *pFrom){.  where
f780: 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
f790: 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77  b, pTo);.  if( w
f7a0: 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
f7b0: 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
f7c0: 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65  LTerm) ){.    me
f7d0: 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c  mset(&pTo->u, 0,
f7e0: 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29   sizeof(pTo->u))
f7f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
f800: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
f810: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
f820: 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
f830: 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
f840: 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
f850: 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
f860: 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
f870: 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
f880: 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
f890: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f8a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
f8b0: 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
f8c0: 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
f8d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
f8e0: 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
f8f0: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
f900: 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
f910: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
f920: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
f930: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f940: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
f950: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
f960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f970: 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
f980: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
f990: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
f9a0: 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
f9b0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
f9c0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
f9d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
f9e0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
f9f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
fa00: 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
fa10: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
fa20: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
fa30: 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
fa40: 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  o) ){.    int i;
fa50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fa60: 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
fa70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
fa80: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
fa90: 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
faa0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
fab0: 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65  ->pWLoop && (pLe
fac0: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
fad0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
fae0: 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ABLE) ){.       
faf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fb00: 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
fb10: 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  aInLoop);.      
fb20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
fb30: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c  te3WhereClauseCl
fb40: 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  ear(&pWInfo->sWC
fb50: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57  );.    while( pW
fb60: 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
fb70: 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
fb80: 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  *p = pWInfo->pLo
fb90: 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  ops;.      pWInf
fba0: 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70  o->pLoops = p->p
fbb0: 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
fbc0: 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
fbd0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  db, p);.    }.  
fbe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fbf0: 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
fc00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
fc10: 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20   TRUE if all of 
fc20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
fc30: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
fc40: 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
fc50: 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
fc60: 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
fc70: 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  )  X is a proper
fc80: 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20   subset of Y.** 
fc90: 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20 61    (3)  X skips a
fca0: 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20  t least as many 
fcb0: 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a  columns as Y.**.
fcc0: 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75  ** By "proper su
fcd0: 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68  bset" we mean th
fce0: 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20  at X uses fewer 
fcf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
fd00: 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64  ms.** than Y and
fd10: 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
fd20: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
fd30: 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20  ed by X is also 
fd40: 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a  used.** by Y..**
fd50: 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
fd60: 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
fd70: 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
fd80: 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
fd90: 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
fda0: 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
fdb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
fdc0: 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
fdd0: 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
fde0: 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
fdf0: 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
fe00: 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20  o be adjusted.  
fe10: 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a 2a  The third rule.*
fe20: 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61  * was added beca
fe30: 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73 6b  use if X uses sk
fe40: 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61  ip-scan less tha
fe50: 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67  n Y it still mig
fe60: 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20  ht.** deserve a 
fe70: 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20  lower cost even 
fe80: 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65  if it is a prope
fe90: 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a  r subset of Y..*
fea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
feb0: 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
fec0: 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
fed0: 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
fee0: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
fef0: 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
ff00: 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
ff10: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
ff20: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
ff30: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
ff40: 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
ff50: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
ff60: 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e  pX->nLTerm-pX->n
ff70: 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65  Skip >= pY->nLTe
ff80: 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a  rm-pY->nSkip ){.
ff90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
ffa0: 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73   X is not a subs
ffb0: 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20  et of Y */.  }. 
ffc0: 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e   if( pY->nSkip >
ffd0: 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74   pX->nSkip ) ret
ffe0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d  urn 0;.  if( pX-
fff0: 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75  >rRun >= pY->rRu
10000 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  n ){.    if( pX-
10010 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e  >rRun > pY->rRun
10020 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10030 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
10040 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66  than Y */.    if
10050 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d  ( pX->nOut > pY-
10060 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30  >nOut ) return 0
10070 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
10080 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
10090 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e   }.  for(i=pX->n
100a0 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  LTerm-1; i>=0; i
100b0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  --){.    if( pX-
100c0 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20  >aLTerm[i]==0 ) 
100d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
100e0 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31  r(j=pY->nLTerm-1
100f0 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
10100 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65      if( pY->aLTe
10110 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72  rm[j]==pX->aLTer
10120 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  m[i] ) break;.  
10130 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
10140 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
10150 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  X not a subset o
10160 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58  f Y since term X
10170 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  [i] not used by 
10180 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  Y */.  }.  retur
10190 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e  n 1;  /* All con
101a0 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a  ditions meet */.
101b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
101c0 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20  adjust the cost 
101d0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65  of WhereLoop pTe
101e0 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f  mplate upwards o
101f0 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a  r downwards so.*
10200 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  * that:.**.**   
10210 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (1) pTemplate co
10220 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e  sts less than an
10230 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
10240 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72  ps that are a pr
10250 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75  oper.**       su
10260 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74  bset of pTemplat
10270 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54  e.**.**   (2) pT
10280 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f  emplate costs mo
10290 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65  re than any othe
102a0 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72  r WhereLoops for
102b0 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65   which pTemplate
102c0 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70  .**       is a p
102d0 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a  roper subset..**
102e0 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72  .** To say "Wher
102f0 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f  eLoop X is a pro
10300 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22  per subset of Y"
10310 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73   means that X us
10320 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52  es fewer.** WHER
10330 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
10340 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10350 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10360 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10370 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64   is.** also used
10380 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63   by Y..*/.static
10390 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41   void whereLoopA
103a0 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20  djustCost(const 
103b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
103c0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
103d0 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d  te){.  if( (pTem
103e0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
103f0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
10400 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
10410 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  or(; p; p=p->pNe
10420 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28  xtLoop){.    if(
10430 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
10440 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74  ate->iTab ) cont
10450 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
10460 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10470 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
10480 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
10490 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
104a0 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
104b0 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a  , pTemplate) ){.
104c0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
104d0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64  pTemplate cost d
104e0 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20  ownward so that 
104f0 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68  it is cheaper th
10500 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a  an its .      **
10510 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20   subset p. */.  
10520 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
10530 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
10540 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
10550 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
10580 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
10590 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
105a0 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20  , p->nOut-1));. 
105b0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
105c0 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
105d0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
105e0 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
105f0 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  - 1;.    }else i
10600 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
10610 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
10620 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b  pTemplate, p) ){
10630 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
10640 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
10650 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  upward so that i
10660 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68  t is costlier th
10670 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20  an p since.     
10680 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73   ** pTemplate is
10690 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
106a0 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57   of p */.      W
106b0 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
106c0 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
106d0 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
106e0 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
10710 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
10720 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
10730 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20  nOut+1));.      
10740 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
10750 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
10760 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10770 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a   = p->nOut + 1;.
10780 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10790 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69  ** Search the li
107a0 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  st of WhereLoops
107b0 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b   in *ppPrev look
107c0 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74  ing for one that
107d0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c   can be.** suppl
107e0 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  anted by pTempla
107f0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
10800 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65   NULL if the Whe
10810 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74  reLoop list cont
10820 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68  ains an entry th
10830 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a  at can supplant.
10840 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e  ** pTemplate, in
10850 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
10860 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e  pTemplate does n
10870 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65  ot belong on the
10880 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
10890 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f  pX is a WhereLoo
108a0 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65  p that pTemplate
108b0 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74   can supplant, t
108c0 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  hen return the.*
108d0 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e  * link that poin
108e0 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20  ts to pX..**.** 
108f0 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  If pTemplate can
10900 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79  not supplant any
10910 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
10920 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
10930 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
10940 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
10950 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  st, then return 
10960 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
10970 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73   tail of the lis
10980 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  t..*/.static Whe
10990 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f  reLoop **whereLo
109a0 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20  opFindLesser(.  
109b0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
109c0 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  ev,.  const Wher
109d0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
109e0 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  .){.  WhereLoop 
109f0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70  *p;.  for(p=(*pp
10a00 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76  Prev); p; ppPrev
10a10 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  =&p->pNextLoop, 
10a20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20  p=*ppPrev){.    
10a30 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65  if( p->iTab!=pTe
10a40 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20  mplate->iTab || 
10a50 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65  p->iSortIdx!=pTe
10a60 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78  mplate->iSortIdx
10a70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10a80 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20  either the iTab 
10a90 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75  or iSortIdx valu
10aa0 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65  es for two Where
10ab0 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65  Loop are differe
10ac0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  nt.      ** then
10ad0 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70   those WhereLoop
10ae0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  s need to be con
10af0 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65  sidered separate
10b00 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a  ly.  Neither is.
10b10 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69        ** a candi
10b20 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20  date to replace 
10b30 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20  the other. */.  
10b40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10b50 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68    }.    /* In th
10b60 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
10b70 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53  entation, the rS
10b80 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69  etup value is ei
10b90 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a  ther zero.    **
10ba0 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20   or the cost of 
10bb0 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
10bc0 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f  matic index (Nlo
10bd0 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67  gN) and the Nlog
10be0 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  N.    ** is the 
10bf0 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  same for compati
10c00 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20  ble WhereLoops. 
10c10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
10c20 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70  ->rSetup==0 || p
10c30 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
10c40 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
10c50 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74        || p->rSet
10c60 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
10c70 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
10c80 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
10c90 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65  ee() always gene
10ca0 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74  rates and insert
10cb0 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
10cc0 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73  index.    ** cas
10cd0 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20  e first.  Hence 
10ce0 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69  compatible candi
10cf0 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  date WhereLoops 
10d00 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72  never have a lar
10d10 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75  ger.    ** rSetu
10d20 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54  p. Call this SET
10d30 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a  UP-INVARIANT */.
10d40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
10d50 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
10d60 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
10d70 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69   /* Any loop usi
10d80 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e  ng an appliation
10d90 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28  -defined index (
10da0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  or PRIMARY KEY o
10db0 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20  r.    ** UNIQUE 
10dc0 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68  constraint) with
10dd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20   one or more == 
10de0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62  constraints is b
10df0 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
10e00 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  n an automatic i
10e10 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20  ndex. Unless it 
10e20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20  is a skip-scan. 
10e30 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  */.    if( (p->w
10e40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
10e50 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20  UTO_INDEX)!=0.  
10e60 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
10e70 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20  ->nSkip)==0.    
10e80 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
10e90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10ea0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
10eb0 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
10ec0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10ed0 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20  COLUMN_EQ)!=0.  
10ee0 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71     && (p->prereq
10ef0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
10f00 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
10f10 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a  ->prereq.    ){.
10f20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10f30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78   }..    /* If ex
10f40 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
10f50 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61   p is better tha
10f60 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65  n pTemplate, pTe
10f70 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20  mplate can be.  
10f80 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20    ** discarded. 
10f90 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
10fa0 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a  better if:.    *
10fb0 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e  *   (1)  p has n
10fc0 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
10fd0 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ies than pTempla
10fe0 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  te, and.    **  
10ff0 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65   (2)  p has an e
11000 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
11010 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  st than pTemplat
11020 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
11030 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
11040 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
11050 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f  ==p->prereq    /
11060 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
11070 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
11080 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20  mplate->rSetup  
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
110b0 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
110c0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
110f0 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65   && p->nOut<=pTe
11100 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20    /* (2c) */.   
11130 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11140 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20   0;  /* Discard 
11150 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
11160 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54   }..    /* If pT
11170 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79  emplate is alway
11180 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c  s better than p,
11190 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f   then cause p to
111a0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
111b0 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d      ** with pTem
111c0 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74  plate.  pTemplat
111d0 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  e is better than
111e0 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20   p if:.    **   
111f0 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (1)  pTemplate h
11200 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
11210 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61  dences than p, a
11220 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
11230 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61   pTemplate has a
11240 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
11250 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20   cost than p..  
11260 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
11270 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
11280 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
11290 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20  emplate->prereq 
112a0 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
112b0 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
112c0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
112f0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
11300 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
11310 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
11340 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11350 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
11360 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11370 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
11380 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
11390 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20      break;   /* 
113a0 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  Cause p to be ov
113b0 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65  erwritten by pTe
113c0 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
113d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50    }.  return ppP
113e0 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rev;.}../*.** In
113f0 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
11400 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
11410 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
11420 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
11430 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
11440 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
11450 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
11460 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
11470 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
11480 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
11490 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
114a0 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
114b0 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
114c0 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
114d0 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
114e0 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
114f0 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
11500 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
11510 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
11520 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
11530 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
11540 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
11550 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
11560 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
11570 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
11580 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
11590 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
115a0 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
115b0 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
115c0 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
115d0 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
115e0 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
115f0 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
11600 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
11610 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
11620 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
11630 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
11640 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
11650 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
11660 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
11670 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
11680 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
11690 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
116a0 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
116b0 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
116c0 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
116d0 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
116e0 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
116f0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
11700 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
11710 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
11720 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
11730 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
11740 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
11750 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
11760 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
11770 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
11780 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
11790 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
117a0 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
117b0 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
117c0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
117d0 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
117e0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
117f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
11800 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
11810 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
11820 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
11830 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
11840 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73  urrent loop.*/.s
11850 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
11860 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
11870 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
11880 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
11890 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
118a0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
118b0 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e  v, *p;.  WhereIn
118c0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
118d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
118e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
118f0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
11900 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
11910 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
11920 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
11930 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
11940 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
11950 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
11960 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
11970 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
11980 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
11990 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
119a0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
119b0 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
119c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
119d0 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
119e0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
119f0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
11a00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
11a10 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
11a20 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
11a30 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11a60 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
11a70 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11a80 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11aa0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11ac0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
11ad0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
11ae0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
11af0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
11b00 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
11b10 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11b20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
11b30 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
11b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
11b50 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
11b60 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11b70 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
11b80 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
11b90 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
11ba0 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
11bb0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11bc0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
11bd0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
11be0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
11bf0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
11c00 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
11c10 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
11c20 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
11c30 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
11c40 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
11c50 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
11c60 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
11c70 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
11c80 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
11c90 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11ca0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11cb0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
11cc0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
11cd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
11ce0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
11cf0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
11d00 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
11d10 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
11d20 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
11d30 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11d40 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
11d50 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
11d60 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
11d70 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
11d80 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
11d90 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
11da0 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
11db0 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
11dc0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
11dd0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
11de0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
11df0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
11e00 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
11e10 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
11e20 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11e30 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11e40 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11e50 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11e60 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
11e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11e80 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
11e90 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
11ea0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
11eb0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11ec0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11ed0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11ee0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
11ef0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
11f00 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
11f10 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
11f20 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
11f30 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
11f40 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
11f50 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
11f60 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
11f70 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
11f80 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
11f90 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
11fa0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
11fb0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
11fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11fd0 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
11fe0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
11ff0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
12000 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
12010 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
12020 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
12030 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
12040 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
12050 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
12060 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
12070 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
12080 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
12090 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
120a0 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
120b0 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
120c0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
120d0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
120e0 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
120f0 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
12100 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
12110 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
12120 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
12130 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
12140 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
12150 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
12160 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20    if( ppTail==0 
12170 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
12180 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b  ToDel = *ppTail;
12190 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65  .      if( pToDe
121a0 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
121b0 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54      *ppTail = pT
121c0 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  oDel->pNextLoop;
121d0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
121e0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
121f0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
12200 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
12210 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
12220 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12230 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a  f(" delete: ");.
12240 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
12250 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
12260 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
12270 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12280 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
12290 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
122a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
122b0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
122c0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
122d0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
122e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
122f0 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
12300 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
12310 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
12320 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
12330 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
12340 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
12350 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
12360 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
12370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12380 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
12390 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
123a0 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
123b0 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
123c0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
123d0 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
123e0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
123f0 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
12400 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
12410 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
12420 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57  *.** For every W
12430 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12440 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
12450 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
12460 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20  * and which has 
12470 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  a truth probabil
12480 69 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20  ity assigned by 
12490 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c  one of the likel
124a0 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65  ihood(),.** like
124b0 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c  ly(), or unlikel
124c0 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  y() SQL function
124d0 73 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73  s, reduce the es
124e0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a  timated number.*
124f0 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
12500 20 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c   by the probabil
12510 69 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ity specified..*
12520 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f  *.** TUNING:  Fo
12530 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
12540 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
12550 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
12560 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
12570 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61  hich does not ha
12580 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74  ve an assigned t
12590 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
125a0 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20  , heuristics.** 
125b0 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20  described below 
125c0 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20  are used to try 
125d0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
125e0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
125f0 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50  y..** TODO --> P
12600 65 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73  erhaps this is s
12610 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f  omething that co
12620 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20  uld be improved 
12630 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62  by better.** tab
12640 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a  le statistics..*
12650 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31  *.** Heuristic 1
12660 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  :  Estimate the 
12670 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12680 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68  y as 93.75%.  Th
12690 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75  e 93.75%.** valu
126a0 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  e corresponds to
126b0 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f   -1 in LogEst no
126c0 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20  tation, so this 
126d0 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a  means decrement.
126e0 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ** the WhereLoop
126f0 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20  .nOut field for 
12700 65 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45  every such WHERE
12710 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
12720 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a  .** Heuristic 2:
12730 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74    If there exist
12740 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  s one or more WH
12750 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
12760 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
12770 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58  "x==EXPR" and EX
12780 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  PR is not a cons
12790 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65  tant 0 or 1, the
127a0 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a  n make sure the.
127b0 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20  ** final output 
127c0 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20  row estimate is 
127d0 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  no greater than 
127e0 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  1/4 of the total
127f0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
12800 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
12810 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12820 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d  , assume that x=
12830 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65  =EXPR will filte
12840 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73  r.** out at leas
12850 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77  t 3 out of 4 row
12860 73 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d  s.  If EXPR is -
12870 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65  1 or 0 or 1, the
12880 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22  n maybe the.** "
12890 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f  x" column is boo
128a0 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20  lean or else -1 
128b0 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63  or 0 or 1 is a c
128c0 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61  ommon default va
128d0 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78  lue.** on the "x
128e0 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20  " column and so 
128f0 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  in that case onl
12900 79 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74  y cap the output
12910 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a   row estimate.**
12920 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20   at 1/2 instead 
12930 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69  of 1/4..*/.stati
12940 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
12950 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
12960 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
12970 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
12980 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12990 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
129a0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
129b0 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
129c0 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
129d0 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
129e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
129f0 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
12a00 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
12a10 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
12a20 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
12a30 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
12a40 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
12a50 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
12a60 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
12a70 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65 20   LogEst iReduce 
12a80 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70  = 0;    /* pLoop
12a90 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f  ->nOut should no
12aa0 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52  t exceed nRow-iR
12ab0 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65  educe */..  asse
12ac0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
12ad0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
12ae0 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
12af0 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
12b00 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
12b10 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b  i>0; i--, pTerm+
12b20 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
12b30 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
12b40 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
12b50 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
12b60 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
12b70 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
12b80 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  elf)==0 ) contin
12b90 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
12ba0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
12bb0 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29  notAllowed)!=0 )
12bc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
12bd0 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  or(j=pLoop->nLTe
12be0 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
12bf0 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f  {.      pX = pLo
12c00 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
12c10 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
12c20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12c30 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29   if( pX==pTerm )
12c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
12c50 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  ( pX->iParent>=0
12c60 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d   && (&pWC->a[pX-
12c70 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72  >iParent])==pTer
12c80 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  m ) break;.    }
12c90 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a  .    if( j<0 ){.
12ca0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
12cb0 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
12cc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
12cd0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12ce0 74 79 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ty is specified 
12cf0 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69  using the likeli
12d00 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20  hood() hints,.  
12d10 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73        ** then us
12d20 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  e the probabilit
12d30 79 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  y provided by th
12d40 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a  e application. *
12d50 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
12d60 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
12d70 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
12d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12d90 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  /* In the absenc
12da0 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72  e of explicit tr
12db0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65  uth probabilitie
12dc0 73 2c 20 75 73 65 20 68 65 75 72 69 73 74 69 63  s, use heuristic
12dd0 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  s to.        ** 
12de0 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62  guess a reasonab
12df0 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  le truth probabi
12e00 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lity. */.       
12e10 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a   pLoop->nOut--;.
12e20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
12e30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f  m->eOperator&(WO
12e40 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20  _EQ|WO_IS) ){.  
12e50 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
12e60 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
12e70 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
12e80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12e90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
12ea0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
12eb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12ec0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
12ed0 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e  Right, &k) && k>
12ee0 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b  =(-1) && k<=1 ){
12ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
12f00 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   10;.          }
12f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12f20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20    k = 20;.      
12f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12f40 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20  if( iReduce<k ) 
12f50 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20  iReduce = k;.   
12f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12f70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
12f80 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f  Loop->nOut > nRo
12f90 77 2d 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f  w-iReduce )  pLo
12fa0 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20  op->nOut = nRow 
12fb0 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a  - iReduce;.}../*
12fc0 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63  .** Adjust the c
12fd0 6f 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73  ost C by the cos
12fe0 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20  tMult facter T. 
12ff0 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72   This only occur
13000 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64  s if.** compiled
13010 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45   with -DSQLITE_E
13020 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a  NABLE_COSTMULT.*
13030 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
13040 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a  ENABLE_COSTMULT.
13050 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
13060 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
13070 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a  )  C += T.#else.
13080 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
13090 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
130a0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
130b0 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
130c0 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
130d0 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
130e0 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
130f0 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78  .** index pIndex
13100 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  . Try to match o
13110 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57  ne more..**.** W
13120 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
13130 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75  n is called, pBu
13140 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75  ilder->pNew->nOu
13150 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a  t contains the .
13160 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
13170 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65  s expected to be
13180 20 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74   visited by filt
13190 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  ering using the 
131a0 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  nEq .** terms on
131b0 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64  ly. If it is mod
131c0 69 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75  ified, this valu
131d0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65  e is restored be
131e0 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
131f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
13200 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
13210 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
13220 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
13230 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
13240 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
13250 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
13260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13270 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
13280 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
13290 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
132a0 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
132b0 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
132c0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
132d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
132e0 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
132f0 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
13300 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
13310 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13330 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
13340 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rc */.  LogEst n
13350 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
13360 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
13370 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
13380 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
13390 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
133a0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
133b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
133c0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
133d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
133e0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
133f0 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
13400 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13410 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
13420 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13430 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
13440 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13450 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
13460 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
13470 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
13480 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
13490 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
134a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
134b0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
134c0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
134d0 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
134e0 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
134f0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
13500 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
13510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13520 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
13530 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
13540 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
13550 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
13560 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
13570 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
13580 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
13590 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
135a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
135b0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
135c0 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
135d0 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
135e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
135f0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
13600 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
13610 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71  .  u16 saved_nEq
13620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13630 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
13640 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
13650 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
13660 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20  16 saved_nSkip; 
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13680 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
13690 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20   of pNew->nSkip 
136a0 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
136b0 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
136c0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
136d0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
136e0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
136f0 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13710 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
13720 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
13730 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13740 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
13750 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
13760 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
13770 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
13780 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13790 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
137a0 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
137b0 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
137c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
137d0 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
137e0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
137f0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
13800 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
13810 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
13820 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
13830 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
13840 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
13850 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13860 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
13870 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
13880 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13890 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
138a0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
138b0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
138c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
138d0 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
138e0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
138f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
13900 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
13910 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
13920 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
13930 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  /*pProbe->tnum<=
13940 30 20 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67  0 ||*/ (pSrc->fg
13950 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
13960 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
13970 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
13980 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
13990 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
139a0 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
139b0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
139c0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
139d0 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_LE|WO_ISNULL
139e0 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66  |WO_IS;.  }.  if
139f0 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  ( pProbe->bUnord
13a00 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d  ered ) opMask &=
13a10 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57   ~(WO_GT|WO_GE|W
13a20 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20  O_LT|WO_LE);..  
13a30 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
13a40 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65  btree.nEq<pProbe
13a50 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20  ->nColumn );..  
13a60 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
13a70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
13a80 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
13a90 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
13aa0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
13ab0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
13ac0 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
13ad0 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
13ae0 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
13af0 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
13b00 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
13b10 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
13b20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
13b30 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
13b40 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
13b50 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
13b80 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
13b90 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
13ba0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
13bb0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
13bc0 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
13bd0 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
13be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13bf0 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
13c00 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
13c10 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
13c20 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
13c30 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
13c40 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
13c50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
13c60 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
13c70 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
13c80 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
13c90 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
13ca0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
13cb0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
13cc0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
13cd0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
13ce0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
13cf0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
13d00 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
13d10 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
13d20 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
13d30 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
13d40 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
13d50 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
13d60 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
13d70 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
13d80 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
13d90 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
13da0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
13db0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
13dc0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
13dd0 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
13de0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
13df0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
13e00 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
13e10 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
13e20 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
13e30 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
13e40 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
13e50 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
13e60 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
13e70 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
13e80 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
13e90 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
13ea0 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
13eb0 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
13ec0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
13ed0 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
13ee0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
13ef0 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
13f00 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13f10 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
13f20 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  s;.    pNew->u.b
13f30 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
13f40 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
13f50 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
13f60 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
13f70 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
13f80 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
13f90 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
13fa0 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
13fb0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
13fc0 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
13fd0 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
13fe0 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
13ff0 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
14000 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
14010 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
14020 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e  .    assert( nIn
14030 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  Mul==0.        |
14040 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
14050 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
14060 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20  NULL)!=0 .      
14070 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
14080 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14090 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20  MN_IN)!=0 .     
140a0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
140b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
140c0 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29  PSCAN)!=0 .    )
140d0 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26  ;..    if( eOp &
140e0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
140f0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
14100 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
14110 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
14120 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
14130 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  IN;.      if( Ex
14140 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14150 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
14160 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
14170 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
14180 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74  ..)":  TUNING: t
14190 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
141a0 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
141b0 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20       nIn = 46;  
141c0 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69  assert( 46==sqli
141d0 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b  te3LogEst(25) );
141e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
141f0 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
14200 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
14210 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
14220 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
14230 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
14240 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
14250 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74       nIn = sqlit
14260 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e  e3LogEst(pExpr->
14270 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  x.pList->nExpr);
14280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14290 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20  ssert( nIn>0 ); 
142a0 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68   /* RHS always h
142b0 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72  as 2 or more ter
142c0 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65  ms...  The parse
142d0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
142e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61            ** cha
142f0 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20  nges "x IN (?)" 
14300 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a  into "x=?". */..
14310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
14320 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
14330 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
14340 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
14350 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
14360 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ];.      pNew->w
14370 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
14380 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
14390 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e   assert( saved_n
143a0 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Eq==pNew->u.btre
143b0 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69  e.nEq );.      i
143c0 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
143d0 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43  D .       || (iC
143e0 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  ol>0 && nInMul==
143f0 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d  0 && saved_nEq==
14400 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d  pProbe->nKeyCol-
14410 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
14420 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
14430 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e  && pProbe->uniqN
14440 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
14450 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
14460 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
14470 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
14480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14490 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
144a0 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
144b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
144c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
144d0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
144e0 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
144f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14500 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
14510 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
14520 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
14530 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
14540 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
14550 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14560 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
14570 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
14580 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
14590 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
145a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
145b0 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
145c0 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
145d0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
145e0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
145f0 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
14600 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e      /* Range con
14610 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
14620 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  e from the LIKE 
14630 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65  optimization are
14640 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
14650 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73  ys used in pairs
14660 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  . */.        pTo
14670 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20  p = &pTerm[1];. 
14680 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
14690 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43  pTop-(pTerm->pWC
146a0 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43  ->a))<pTerm->pWC
146b0 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  ->nTerm );.     
146c0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
146d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
146e0 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20  LIKEOPT );.     
146f0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
14700 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
14710 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
14720 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
14730 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
14740 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
14750 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
14760 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
14770 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
14780 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20  +] = pTop;.     
14790 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
147a0 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
147b0 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MIT;.      }.   
147c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
147d0 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
147e0 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
147f0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
14800 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
14810 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14820 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
14830 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
14840 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
14850 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
14860 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
14870 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
14880 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
14890 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
148a0 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
148d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
148e0 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  : 0;.    }..    
148f0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
14900 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73   pNew->nOut is s
14910 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
14920 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
14930 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76  d to.    ** be v
14940 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e  isited by the in
14950 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20  dex scan before 
14960 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d  considering term
14970 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20   pTerm, or the. 
14980 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20     ** values of 
14990 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20  nIn and nInMul. 
149a0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
149b0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c  assuming that al
149c0 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28  l .    ** "x IN(
149d0 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20  ...)" terms are 
149e0 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78  replaced with "x
149f0 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63   = ?". This bloc
14a00 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a  k updates.    **
14a10 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e   the value of pN
14a20 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f  ew->nOut to acco
14a30 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62  unt for pTerm (b
14a40 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75  ut not nIn/nInMu
14a50 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  l).  */.    asse
14a60 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
14a70 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
14a80 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
14a90 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14aa0 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
14ab0 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
14ac0 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61   using stat3/sta
14ad0 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20  t4 data. Or, if 
14ae0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
14af0 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a  3/stat4.      **
14b00 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d   data, using som
14b10 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65  e other estimate
14b20 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72  .  */.      wher
14b30 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
14b40 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
14b50 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
14b60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14b70 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b      int nEq = ++
14b80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14b90 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  q;.      assert(
14ba0 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c   eOp & (WO_ISNUL
14bb0 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  L|WO_EQ|WO_IN|WO
14bc0 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61  _IS) );..      a
14bd0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14be0 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14bf0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
14c00 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26  ->truthProb<=0 &
14c10 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  & pProbe->aiColu
14c20 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30  mn[saved_nEq]>=0
14c30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
14c40 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e  rt( (eOp & WO_IN
14c50 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20  ) || nIn==0 );. 
14c60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14c70 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a   eOp & WO_IN );.
14c80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
14c90 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
14ca0 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20  thProb;.        
14cb0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
14cc0 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
14cd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14ce0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
14cf0 41 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77  AT4.        tRow
14d00 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
14d10 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c        if( nInMul
14d20 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
14d30 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65   pProbe->nSample
14d40 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e   .         && pN
14d50 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
14d60 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
14d70 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  Col.         && 
14d80 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d  ((eOp & WO_IN)==
14d90 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  0 || !ExprHasPro
14da0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
14db0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
14dc0 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
14dd0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
14de0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
14df0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
14e00 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  ( (eOp & (WO_EQ|
14e10 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29  WO_ISNULL|WO_IS)
14e20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14e30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14e40 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  p & WO_EQ );.   
14e50 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14e60 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29  e( eOp & WO_IS )
14e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
14e80 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14e90 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
14ea0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14eb0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
14ec0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
14ed0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
14ee0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
14ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14f00 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
14f10 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
14f20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
14f30 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
14f40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14f50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
14f60 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14f70 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14f80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14fa0 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
14fb0 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74  /* Jump out of t
14fc0 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f  he pTerm loop */
14fd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
14fe0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Out ){.         
14ff0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15000 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f  sqlite3LogEst(nO
15010 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
15020 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e   if( pNew->nOut>
15030 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65  saved_nOut ) pNe
15040 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
15050 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  nOut;.          
15060 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
15070 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nIn;.          }
15080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15090 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29     if( nOut==0 )
150a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
150b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
150c0 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62  ->nOut += (pProb
150d0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
150e0 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69  Eq] - pProbe->ai
150f0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d  RowLogEst[nEq-1]
15100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
15110 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
15120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15130 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
15140 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69  ere is no likeli
15150 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73  hood() value, as
15160 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20  sume that a .   
15170 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c           ** "col
15180 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73   IS NULL" expres
15190 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69  sion matches twi
151a0 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20  ce as many rows 
151b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
151c0 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20  as (col=?). */. 
151d0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
151e0 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20  >nOut += 10;.   
151f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15200 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15210 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f  ..    /* Set rCo
15220 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73  stIdx to the cos
15230 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65  t of visiting se
15240 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69  lected rows in i
15250 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a  ndex. Add.    **
15260 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75   it to pNew->rRu
15270 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72  n, which is curr
15280 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65  ently set to the
15290 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64   cost of the ind
152a0 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  ex.    ** seek o
152b0 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  nly. Then, if th
152c0 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
152d0 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20  ring index, add 
152e0 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
152f0 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  ** visiting the 
15300 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
15310 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
15320 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d  rCostIdx = pNew-
15330 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a  >nOut + 1 + (15*
15340 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
15350 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a  )/pSrc->pTab->sz
15360 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  TabRow;.    pNew
15370 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
15380 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
15390 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20  ze, rCostIdx);. 
153a0 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
153b0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
153c0 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
153d0 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
153e0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
153f0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
15400 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
15410 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20  nOut + 16);.    
15420 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d  }.    ApplyCostM
15430 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
15440 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54  rRun, pProbe->pT
15450 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  able->costMult);
15460 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75  ..    nOutUnadju
15470 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  sted = pNew->nOu
15480 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  t;.    pNew->rRu
15490 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  n += nInMul + nI
154a0 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  n;.    pNew->nOu
154b0 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  t += nInMul + nI
154c0 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  n;.    whereLoop
154d0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75  OutputAdjust(pBu
154e0 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77  ilder->pWC, pNew
154f0 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  , rSize);.    rc
15500 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
15510 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
15520 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
15530 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
15540 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
15550 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
15560 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15570 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15580 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15590 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a  nOutUnadjusted;.
155a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
155b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
155c0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
155d0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
155e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
155f0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  robe->nColumn.  
15600 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
15610 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15620 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
15630 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
15640 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
15650 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15660 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
15670 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15680 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
15690 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
156a0 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
156b0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
156c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
156d0 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
156e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
156f0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
15700 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
15710 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
15720 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
15730 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
15740 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
15750 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
15760 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
15770 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
15780 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
15790 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
157a0 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
157b0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
157c0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
157d0 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
157e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
157f0 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
15800 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
15810 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
15820 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
15830 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
15840 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
15850 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
15860 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
15870 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
15880 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
15890 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
158a0 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
158b0 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
158c0 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
158d0 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
158e0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
158f0 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
15900 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
15910 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
15920 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
15930 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
15940 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
15950 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
15960 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
15970 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
15980 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
15990 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
159a0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
159b0 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
159c0 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
159d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
159e0 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
159f0 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
15a00 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
15a10 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
15a20 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
15a30 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
15a40 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
15a50 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  =0.   && pProbe-
15a60 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
15a70 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f  ed_nEq+1]>=42  /
15a80 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
15a90 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
15aa0 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77  */.   && (rc = w
15ab0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
15ac0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
15ad0 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54  LTerm+1))==SQLIT
15ae0 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  E_OK.  ){.    Lo
15af0 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
15b00 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
15b10 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  q++;.    pNew->n
15b20 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
15b30 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15b40 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
15b50 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
15b60 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
15b70 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70  N;.    nIter = p
15b80 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
15b90 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20  st[saved_nEq] - 
15ba0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
15bb0 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
15bc0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
15bd0 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f   -= nIter;.    /
15be0 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75  * TUNING:  Becau
15bf0 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73  se uncertainties
15c00 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
15c10 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  s for skip-scan 
15c20 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20  queries,.    ** 
15c30 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67  add a 1.375 fudg
15c40 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65  e factor to make
15c50 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68   skip-scan sligh
15c60 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e  tly less likely.
15c70 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d   */.    nIter +=
15c80 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f   5;.    whereLoo
15c90 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
15ca0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
15cb0 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e  Probe, nIter + n
15cc0 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77  InMul);.    pNew
15cd0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15ce0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Out;.    pNew->u
15cf0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
15d00 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
15d10 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
15d20 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d  nSkip;.    pNew-
15d30 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
15d40 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20  _wsFlags;.  }.. 
15d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15d60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
15d70 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
15d80 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
15d90 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
15da0 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
15db0 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
15dc0 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
15dd0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
15de0 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
15df0 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
15e00 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
15e10 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
15e20 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
15e30 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
15e40 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
15e50 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
15e60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
15e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
15e80 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
15e90 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
15ea0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
15eb0 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
15ec0 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
15ed0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
15ee0 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
15ef0 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
15f00 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
15f10 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
15f20 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
15f30 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
15f40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
15f50 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
15f60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
15f70 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
15f80 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
15f90 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
15fa0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
15fb0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
15fc0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
15fd0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15fe0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
15ff0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
16000 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
16010 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
16020 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
16030 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
16040 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
16050 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
16060 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
16070 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
16080 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
16090 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
160a0 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
160b0 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
160c0 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
160d0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
160e0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
160f0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
16100 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
16110 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
16120 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
16130 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16140 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
16150 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  pr,aColExpr->a[j
16160 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72  j].pExpr,iCursor
16170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
16180 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
16190 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
161a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
161b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
161c0 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68  urn a bitmask wh
161d0 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20  ere 1s indicate 
161e0 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70  that the corresp
161f0 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66  onding column of
16200 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73  .** the table is
16210 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
16220 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
16230 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72  st 63 columns ar
16240 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  e considered..*/
16250 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
16260 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49  columnsInIndex(I
16270 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42  ndex *pIdx){.  B
16280 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
16290 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70  int j;.  for(j=p
162a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  Idx->nColumn-1; 
162b0 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
162c0 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
162d0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
162e0 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
162f0 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
16300 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
16310 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20  tcase( x==BMS-2 
16320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42  );.      if( x<B
16330 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
16340 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(x);.    }.  
16350 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
16360 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
16370 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
16380 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
16390 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
163a0 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
163b0 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
163c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
163d0 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
163e0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
163f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
16400 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
16410 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
16420 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
16430 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
16440 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
16450 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28  *pTerm;.  while(
16460 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
16470 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21  AND ){.    if( !
16480 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
16490 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43  alIndex(iTab,pWC
164a0 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20  ,pWhere->pLeft) 
164b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
164c0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
164d0 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66  >pRight;.  }.  f
164e0 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
164f0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
16500 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
16510 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
16520 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
16530 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
16540 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
16550 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  r(pExpr, pWhere,
16560 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20   iTab) .     && 
16570 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  (!ExprHasPropert
16580 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
16590 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e  Join) || pExpr->
165a0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
165b0 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20  =iTab).    ){.  
165c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
165d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
165e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
165f0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
16600 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
16610 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
16620 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
16630 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
16640 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
16650 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
16660 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
16670 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
16680 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
16690 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
166a0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
166b0 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
166c0 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
166d0 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
166e0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
166f0 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
16700 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
16710 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
16720 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
16730 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
16740 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
16750 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
16760 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
16770 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
16780 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
16790 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
167a0 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
167b0 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
167c0 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
167d0 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
167e0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
167f0 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
16810 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
16820 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
16830 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
16840 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
16850 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
16860 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
16870 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
16880 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
16890 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
168a0 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
168b0 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
168c0 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
168d0 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
168e0 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
168f0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
16900 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
16910 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16920 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
16930 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
16940 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
16950 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
16960 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
16970 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
16980 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
16990 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
169a0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
169b0 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
169c0 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
169d0 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
169e0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
169f0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
16a00 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
16a10 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
16a20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
16a30 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
16a40 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
16a50 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
16a60 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
16a70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
16a80 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
16a90 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
16aa0 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
16ab0 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
16ac0 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
16ad0 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
16ae0 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c  ed values (nRow,
16af0 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20   nVisit, nSeek) 
16b00 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20  often contain a 
16b10 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  large amount.** 
16b20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20  of uncertainty. 
16b30 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
16b40 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73  , scoring is des
16b50 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c  igned to pick pl
16b60 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20  ans that.** "do 
16b70 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20  the least harm" 
16b80 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  if the estimates
16b90 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e   are inaccurate.
16ba0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61    For example, a
16bb0 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61  .** log(nRow) fa
16bc0 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
16bd0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  from a non-cover
16be0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
16bf0 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69  n order to.** bi
16c00 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69  as the scoring i
16c10 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67  n favor of using
16c20 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65   an index, since
16c30 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a   the worst-case.
16c40 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ** performance o
16c50 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
16c60 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74   is far better t
16c70 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61  han the worst-ca
16c80 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  se performance.*
16c90 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  * of a full tabl
16ca0 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
16cb0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
16cc0 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
16cd0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
16ce0 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
16cf0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
16d00 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
16d10 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
16d20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
16d30 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
16d40 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
16d50 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
16d60 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
16d70 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
16d80 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
16d90 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
16da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16db0 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
16dc0 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
16dd0 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16df0 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
16e00 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
16e10 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f  mary key */.  Lo
16e20 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  gEst aiRowEstPk[
16e30 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2];       /* The
16e40 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76   aiRowLogEst[] v
16e50 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
16e60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
16e70 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
16e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
16e90 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
16ea0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16eb0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
16ec0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
16ed0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
16ee0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
16ef0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
16f00 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
16f10 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
16f20 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
16f30 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
16f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16f50 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
16f60 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
16f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16f80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
16f90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
16fa0 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
16fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16fc0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
16fd0 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
16fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16ff0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
17000 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17020 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
17030 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
17040 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
17050 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
17060 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
17070 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17080 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
17090 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
170a0 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
170b0 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
170c0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
170d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
170e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
170f0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
17100 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
17110 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
17120 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
17130 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
17140 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
17150 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
17160 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
17170 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
17180 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
17190 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
171a0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
171b0 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
171c0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
171d0 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
171e0 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  BIndex ){.    /*
171f0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
17200 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
17210 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
17220 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
17230 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
17240 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  pIBIndex;.  }els
17250 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
17260 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
17270 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
17280 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
17290 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
172a0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
172b0 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
172c0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
172d0 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
172e0 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
172f0 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
17300 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
17310 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
17320 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
17330 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
17340 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
17350 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
17360 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
17370 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
17380 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
17390 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
173b0 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
173c0 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
173d0 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
173e0 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
173f0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
17400 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
17410 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
17420 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
17430 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
17440 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
17450 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
17460 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
17470 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
17480 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
17490 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
174a0 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
174b0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
174c0 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
174d0 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
174e0 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
174f0 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
17500 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
17510 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
17520 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f   if( pSrc->fg.no
17530 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
17540 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
17550 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
17560 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
17570 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
17580 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
17590 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
175a0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
175b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
175c0 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
175d0 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
175e0 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
175f0 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
17600 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  e = pTab->nRowLo
17610 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  gEst;.  rLogSize
17620 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
17630 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17640 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
17650 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f  _INDEX.  /* Auto
17660 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
17670 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
17680 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a  ->pOrSet      /*
17690 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20   Not part of an 
176a0 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
176b0 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  */.   && (pWInfo
176c0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
176d0 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45  HERE_NO_AUTOINDE
176e0 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49  X)==0.   && (pWI
176f0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
17700 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
17710 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
17720 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64   && pSrc->pIBInd
17730 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61  ex==0      /* Ha
17740 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
17750 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
17760 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64  !pSrc->fg.notInd
17770 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f  exed   /* Has no
17780 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
17790 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73  use */.   && Has
177a0 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20  Rowid(pTab)     
177b0 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f      /* Not WITHO
177c0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
177d0 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
177e0 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
177f0 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
17800 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65  d /* Not a corre
17810 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
17820 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
17830 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f  g.isRecursive  /
17840 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76  * Not a recursiv
17850 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  e common table e
17860 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
17870 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
17880 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
17890 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
178a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
178b0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
178c0 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
178d0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
178e0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
178f0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
17900 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
17910 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
17920 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
17930 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
17940 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
17950 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
17960 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
17970 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
17980 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
17990 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
179a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
179b0 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
179c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
179d0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
179e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
179f0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
17a00 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
17a10 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
17a20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
17a30 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
17a40 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
17a50 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
17a60 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
17a70 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
17a80 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
17a90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
17aa0 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
17ab0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
17ac0 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
17ad0 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
17ae0 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
17af0 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
17b00 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20  tables or 1.375 
17b10 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76  (LogEst=4) for v
17b20 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
17b30 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
17b40 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
17b50 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
17b60 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
17b70 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
17b80 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
17b90 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
17ba0 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
17bb0 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
17bc0 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
17bd0 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
17be0 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
17bf0 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
17c00 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
17c10 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
17c20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
17c30 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
17c40 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
17c50 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
17c60 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
17c70 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20  Size + 4;.      
17c80 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
17c90 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
17ca0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
17cb0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
17cc0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17cd0 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20  rSetup += 24;.  
17ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17cf0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
17d00 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
17d10 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
17d20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
17d30 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
17d40 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
17d50 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
17d60 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
17d70 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
17d80 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
17d90 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
17da0 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
17db0 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
17dc0 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
17dd0 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
17de0 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
17df0 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
17e00 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
17e10 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
17e20 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
17e30 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
17e40 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
17e50 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
17e60 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
17e70 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
17e80 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
17e90 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17ea0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
17eb0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
17ec0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17ed0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
17ee0 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
17ef0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
17f00 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
17f10 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
17f20 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
17f30 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
17f40 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
17f50 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
17f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17f70 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
17f80 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
17f90 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
17fa0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
17fb0 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
17fc0 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
17fd0 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
17fe0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
17ff0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
18000 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
18010 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
18020 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
18030 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
18040 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
18050 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
18060 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
18070 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
18080 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
18090 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
180a0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
180b0 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
180c0 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
180d0 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
180e0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
180f0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
18100 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
18110 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
18120 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
18130 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
18140 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
18150 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
18160 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
18170 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
18180 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
18190 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
181a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
181b0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
181c0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
181d0 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
181e0 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
181f0 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
18200 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
18210 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
18220 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
18230 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
18240 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
18250 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
18260 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
18270 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
18280 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
18290 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
182a0 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
182b0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
182c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
182d0 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
182e0 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
182f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
18300 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
18310 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
18320 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
18330 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
18340 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
18350 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
18360 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
18370 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
18380 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
18390 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
183a0 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
183b0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
183c0 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
183d0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
183e0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
183f0 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
18400 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
18410 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
18420 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
18430 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
18440 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
18450 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
18460 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
18470 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
18480 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
18490 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
184a0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
184b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
184c0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
184d0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
184e0 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
184f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18500 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
18510 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
18520 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
18530 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
18540 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
18550 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
18560 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
18570 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
18580 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18590 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
185a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
185b0 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
185c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
185d0 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
185e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
185f0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
18600 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
18610 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
18620 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
18630 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
18640 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
18650 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
18660 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
18670 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18680 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
18690 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
186a0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
186b0 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
186c0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
186d0 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
186e0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
186f0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
18700 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
18710 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
18720 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
18730 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
18740 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
18750 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
18760 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
18770 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
18780 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
18790 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
187a0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
187b0 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
187c0 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
187d0 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
187e0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
187f0 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
18800 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
18810 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
18820 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
18830 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
18840 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
18850 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
18860 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
18870 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
18880 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
18890 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
188a0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
188b0 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
188c0 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
188d0 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
188e0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
188f0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
18900 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
18910 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
18920 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
18930 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
18940 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
18950 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
18960 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
18970 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18980 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
18990 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
189a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
189b0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
189c0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
189d0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
189e0 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
189f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18a00 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
18a10 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
18a20 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
18a30 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
18a40 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
18a50 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
18a60 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
18a70 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
18a80 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
18a90 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
18aa0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
18ab0 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
18ac0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
18ad0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
18ae0 3e 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61  >pIBIndex ) brea
18af0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
18b00 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
18b10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
18b20 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64  ALTABLE./*.** Ad
18b30 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
18b40 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
18b50 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
18b60 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
18b70 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
18b80 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
18b90 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
18ba0 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
18bb0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
18bc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45   there are no LE
18bd0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
18be0 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75   joins in the qu
18bf0 65 72 79 2c 20 62 6f 74 68 20 6d 45 78 74 72 61  ery, both mExtra
18c00 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
18c10 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
18c20 4f 74 68 65 72 77 69 73 65 2c 20 6d 45 78 74 72  Otherwise, mExtr
18c30 61 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61  a is a mask of a
18c40 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  ll FROM clause.*
18c50 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  * entries that o
18c60 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
18c70 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
18c80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18c90 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61   and are.** sepa
18ca0 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79  rated from it by
18cb0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45   at least one LE
18cc0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
18cd0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
18ce0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61  .** mUnusable ma
18cf0 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  sk contains all 
18d00 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
18d10 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61  ies that occur a
18d20 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74  fter the.** virt
18d30 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72  ual table and ar
18d40 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  e separated from
18d50 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
18d60 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20  one LEFT or .** 
18d70 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a  CROSS JOIN. .**.
18d80 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
18d90 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72  if the query wer
18da0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  e:.**.**   ... F
18db0 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20  ROM t1, t2 LEFT 
18dc0 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20  JOIN t3, t4, vt 
18dd0 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74  CROSS JOIN t5, t
18de0 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45  6;.**.** then mE
18df0 78 74 72 61 20 63 6f 72 72 65 73 70 6f 6e 64 73  xtra corresponds
18e00 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64   to (t1, t2) and
18e10 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74   mUnusable to (t
18e20 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c  5, t6)..**.** Al
18e30 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  l the tables in 
18e40 6d 45 78 74 72 61 20 6d 75 73 74 20 62 65 20 73  mExtra must be s
18e50 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68  canned before th
18e60 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61  e current virtua
18e70 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20  l .** table. So 
18e80 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68  any terms for wh
18e90 69 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69  ich all prerequi
18ea0 73 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66  sites are satisf
18eb0 69 65 64 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72  ied by .** mExtr
18ec0 61 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  a may be specifi
18ed0 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
18ee0 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
18ef0 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
18f00 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
18f10 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
18f20 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
18f30 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
18f40 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
18f50 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
18f60 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
18f70 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
18f80 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
18f90 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
18fa0 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
18fb0 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
18fc0 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
18fd0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
18fe0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
18ff0 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
19000 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
19010 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
19020 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
19030 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
19040 20 6d 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   mExtra,        
19050 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
19060 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
19070 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
19080 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
19090 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
190a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
190b0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
190c0 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
190d0 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   one */.){.  Whe
190e0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
190f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
19100 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
19110 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
19120 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
19130 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
19140 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
19150 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
19160 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
19170 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
19180 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19190 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
191a0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
191b0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
191c0 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
191d0 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
191e0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
191f0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
19200 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
19210 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
19220 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
19230 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
19240 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
19250 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
19260 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
19270 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
19280 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
19290 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
192a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
192b0 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
192d0 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
192e0 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
192f0 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
19300 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19310 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
19320 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
19330 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
19340 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
19370 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
19380 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
19390 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
193a0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
193b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
193c0 73 65 72 74 28 20 28 6d 45 78 74 72 61 20 26 20  sert( (mExtra & 
193d0 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b  mUnusable)==0 );
193e0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
193f0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
19400 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
19410 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
19420 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
19430 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
19440 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
19450 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
19460 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
19470 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
19480 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
19490 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
194a0 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
194b0 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
194c0 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
194d0 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
194e0 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20  pWC, mUnusable, 
194f0 70 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70  pSrc,pBuilder->p
19500 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
19510 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
19520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19530 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
19540 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
19550 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
19560 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
19570 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
19580 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
19590 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
195a0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
195b0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
195c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
195d0 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
195e0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
195f0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
19600 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
19610 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
19620 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
19630 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19640 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
19650 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19660 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
19670 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
19680 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
19690 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
196a0 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
196b0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
196c0 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
196d0 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
196e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
196f0 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
19700 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
19710 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
19720 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
19730 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
19740 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
19750 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
19760 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
19770 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
19780 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
19790 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
197a0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
197b0 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
197c0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
197d0 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
197e0 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
197f0 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
19800 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
19810 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
19820 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
19830 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
19840 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
19850 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
19860 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
19870 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
19880 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
19890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
198a0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
198b0 68 74 20 26 20 7e 6d 45 78 74 72 61 29 21 3d 30  ht & ~mExtra)!=0
198c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
198d0 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
198e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
198f0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
19900 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  or & WO_IN)==0 )
19910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
19920 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
19930 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
19940 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19950 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
19960 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
19970 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
19980 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
19990 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
199a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
199b0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
199c0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
199d0 68 74 20 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30  ht & ~mExtra)==0
199e0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
199f0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
19a00 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
19a10 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
19a20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19a30 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
19a40 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
19a50 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
19a60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
19a70 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
19a80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19a90 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
19aa0 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
19ab0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
19ac0 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
19ad0 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
19ae0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
19af0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
19b00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19b20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
19b30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
19b40 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
19b50 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
19b60 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
19b70 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
19b80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
19b90 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
19ba0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
19bb0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
19bc0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
19bd0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
19be0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
19bf0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
19c00 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
19c10 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
19c20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19c30 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
19c40 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
19c50 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e  le)2;.    pIdxIn
19c60 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
19c70 73 20 3d 20 32 35 3b 0a 20 20 20 20 70 49 64 78  s = 25;.    pIdx
19c80 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d  Info->idxFlags =
19c90 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
19ca0 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c  ->colUsed = (sql
19cb0 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d  ite3_int64)pSrc-
19cc0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 72 63  >colUsed;.    rc
19cd0 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78   = vtabBestIndex
19ce0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
19cf0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  IdxInfo);.    if
19d00 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
19d10 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
19d20 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  t;.    pIdxCons 
19d30 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
19d40 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
19d50 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
19d60 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
19d70 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
19d80 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54   mExtra;.    mxT
19d90 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  erm = -1;.    as
19da0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
19db0 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
19dc0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
19dd0 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
19de0 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  ++) pNew->aLTerm
19df0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  [i] = 0;.    pNe
19e00 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
19e10 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sk = 0;.    for(
19e20 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
19e30 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
19e40 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  s++){.      if( 
19e50 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
19e60 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
19e70 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
19e80 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
19e90 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
19ea0 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
19eb0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
19ec0 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20     || j<0.      
19ed0 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54     || j>=pWC->nT
19ee0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  erm.         || 
19ef0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
19f00 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29  rm]!=0.        )
19f10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
19f20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
19f30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19f40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19f50 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28   "%s.xBestIndex(
19f60 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20  ) malfunction", 
19f70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
19f80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65          goto whe
19f90 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
19fa0 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
19fb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19fc0 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69  iTerm==nConstrai
19fd0 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  nt-1 );.        
19fe0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29  testcase( j==0 )
19ff0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a000 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72  se( j==pWC->nTer
1a010 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  m-1 );.        p
1a020 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
1a030 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
1a040 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d  >prereq |= pTerm
1a050 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1a060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1a070 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
1a080 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
1a090 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
1a0a0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1a0b0 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
1a0c0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
1a0d0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  erm;.        tes
1a0e0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35  tcase( iTerm==15
1a0f0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1a100 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20  case( iTerm==16 
1a110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1a120 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67  Term<16 && pUsag
1a130 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77  e[i].omit ) pNew
1a140 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
1a150 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20  k |= 1<<iTerm;. 
1a160 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1a170 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1a180 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
1a190 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
1a1a0 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
1a1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1a1c0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
1a1d0 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
1a1e0 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
1a1f0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
1a200 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
1a210 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
1a220 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
1a230 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
1a240 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
1a250 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
1a260 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
1a270 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
1a280 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
1a290 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
1a2a0 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
1a2b0 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
1a2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1a2d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1a2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76            /* A v
1a2f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
1a300 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
1a310 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
1a320 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
1a330 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
1a340 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a350 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
1a360 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
1a370 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rms.          **
1a380 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1a390 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
1a3a0 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
1a3b0 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
1a3c0 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
1a3d0 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
1a3e0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
1a3f0 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
1a400 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  erge.          *
1a410 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
1a420 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
1a430 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1a440 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  med = 0;.       
1a450 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
1a460 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  Flags &= ~SQLITE
1a470 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51  _INDEX_SCAN_UNIQ
1a480 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  UE;.        }.  
1a490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a4a0 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69  if( i>=nConstrai
1a4b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nt ){.      pNew
1a4c0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72  ->nLTerm = mxTer
1a4d0 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m+1;.      asser
1a4e0 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c  t( pNew->nLTerm<
1a4f0 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  =pNew->nLSlot );
1a500 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
1a510 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64  tab.idxNum = pId
1a520 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20  xInfo->idxNum;. 
1a530 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
1a540 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
1a550 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a560 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  eIdxStr;.      p
1a570 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1a580 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
1a590 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
1a5a0 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49  b.idxStr = pIdxI
1a5b0 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20  nfo->idxStr;.   
1a5c0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1a5d0 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29  isOrdered = (i8)
1a5e0 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72  (pIdxInfo->order
1a5f0 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20  ByConsumed ?.   
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
1a630 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20  derBy : 0);.    
1a640 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1a650 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
1a660 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
1a670 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  gEstFromDouble(p
1a680 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1a690 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70  edCost);.      p
1a6a0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
1a6b0 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e  te3LogEst(pIdxIn
1a6c0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
1a6d0 73 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  s);..      /* Se
1a6e0 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  t the WHERE_ONER
1a6f0 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78  OW flag if the x
1a700 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68  BestIndex() meth
1a710 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 20  od indicated.   
1a720 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73     ** that the s
1a730 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61  can will visit a
1a740 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20  t most one row. 
1a750 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69  Clear it otherwi
1a760 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  se. */.      if(
1a770 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c   pIdxInfo->idxFl
1a780 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44  ags & SQLITE_IND
1a790 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29  EX_SCAN_UNIQUE )
1a7a0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1a7b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1a7c0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d  _ONEROW;.      }
1a7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
1a7e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  ew->wsFlags &= ~
1a7f0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1a800 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 65 72      }.      wher
1a810 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1a820 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1a830 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
1a840 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
1a850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1a860 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1a870 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
1a880 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1a890 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1a8a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
1a8b0 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
1a8c0 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
1a8d0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1a8e0 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
1a8f0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
1a900 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
1a910 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a920 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
1a930 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1a940 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a950 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1a960 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
1a970 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
1a980 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
1a990 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
1a9a0 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
1a9b0 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
1a9c0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1a9d0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1a9e0 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  Or(.  WhereLoopB
1a9f0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1aa00 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  , .  Bitmask mEx
1aa10 74 72 61 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20  tra, .  Bitmask 
1aa20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57  mUnusable.){.  W
1aa30 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1aa40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1aa50 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
1aa60 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
1aa70 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
1aa80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1aa90 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
1aaa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1aab0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
1aac0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
1aad0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1aae0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
1aaf0 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
1ab00 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
1ab10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ab20 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
1ab30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1ab40 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
1ab50 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
1ab60 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1ab70 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
1ab80 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
1ab90 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
1aba0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
1abb0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
1abc0 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20  >iTab;.  iCur = 
1abd0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
1abe0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
1abf0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
1ac00 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1ac10 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
1ac20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1ac30 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
1ac40 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
1ac50 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
1ac60 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
1ac70 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
1ac80 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
1ac90 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
1aca0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
1acb0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
1acc0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1acd0 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
1ace0 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
1acf0 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
1ad00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
1ad10 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
1ad20 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
1ad30 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
1ad40 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
1ad50 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
1ad60 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
1ad70 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
1ad80 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
1ad90 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
1ada0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1adb0 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73  , ("Begin proces
1adc0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1add0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1ade0 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
1adf0 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
1ae00 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
1ae10 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1ae20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
1ae30 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
1ae40 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1ae50 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
1ae60 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
1ae70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
1ae80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1ae90 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
1aea0 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
1aeb0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
1aec0 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
1aed0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
1aee0 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
1aef0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1af00 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
1af10 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1af20 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
1af30 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
1af40 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
1af50 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1af60 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
1af70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1af80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1af90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1afa0 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
1afb0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1afc0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
1afd0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1afe0 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f  , ("OR-term %d o
1aff0 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74  f %p has %d subt
1b000 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20  erms:\n", .     
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1b020 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57  nt)(pOrTerm-pOrW
1b030 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53  C->a), pTerm, sS
1b040 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
1b050 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
1b060 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1b070 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
1b080 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1b090 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57  ; i<sSubBuild.pW
1b0a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1b0c0 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62  eTermPrint(&sSub
1b0d0 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c  Build.pWC->a[i],
1b0e0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
1b0f0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
1b100 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1b110 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1b120 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
1b130 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1b140 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1b150 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1b160 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
1b170 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20  bBuild, mExtra, 
1b180 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1b190 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1b1a0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1b1b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1b1c0 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
1b1d0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
1b1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b1f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b210 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b220 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64  AddOr(&sSubBuild
1b230 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61  , mExtra, mUnusa
1b240 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ble);.        }.
1b250 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1b270 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
1b280 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
1b290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1b2a0 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1b2b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b2c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b2d0 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1b2e0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1b2f0 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
1b300 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1b310 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1b320 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
1b330 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
1b340 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1b350 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
1b360 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
1b370 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1b380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
1b390 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
1b3a0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1b3b0 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
1b3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
1b3d0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
1b3e0 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
1b3f0 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
1b400 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1b430 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1b440 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
1b450 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1b480 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1b490 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
1b4a0 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
1b4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b4c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b4d0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1b4e0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
1b4f0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1b500 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
1b510 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1b520 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
1b530 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
1b540 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
1b550 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1b560 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
1b570 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
1b580 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
1b590 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
1b5a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b5b0 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
1b5c0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
1b5d0 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
1b5e0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
1b5f0 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
1b600 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
1b610 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
1b620 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
1b630 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
1b640 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
1b650 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
1b660 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
1b670 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
1b680 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
1b690 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
1b6a0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
1b6b0 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
1b6c0 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
1b6d0 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
1b6e0 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
1b6f0 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
1b700 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
1b710 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
1b720 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
1b730 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
1b740 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
1b750 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
1b760 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
1b770 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
1b780 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
1b790 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
1b7a0 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
1b7b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1b7c0 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
1b7d0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
1b7e0 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
1b7f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1b800 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
1b810 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
1b820 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
1b830 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
1b840 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
1b850 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
1b860 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
1b870 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
1b880 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1b890 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
1b8a0 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
1b8b0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1b8c0 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
1b8d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1b8e0 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
1b8f0 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
1b900 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1b910 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1b920 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
1b930 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1b940 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f  0x200, ("End pro
1b950 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1b960 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1b970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b990 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1b9a0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1b9b0 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
1b9c0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1b9d0 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
1b9e0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1b9f0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
1ba00 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1ba10 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1ba20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
1ba30 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
1ba40 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
1ba50 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
1ba60 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
1ba70 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
1ba80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ba90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1baa0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1bab0 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62  em *pEnd = &pTab
1bac0 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  List->a[pWInfo->
1bad0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74  nLevel];.  sqlit
1bae0 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
1baf0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
1bb00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bb10 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1bb20 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72  pNew;.  u8 prior
1bb30 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20  Jointype = 0;.. 
1bb40 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
1bb50 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1bb60 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
1bb70 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
1bb80 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1bb90 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
1bba0 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
1bbb0 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
1bbc0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
1bbd0 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c  em<pEnd; iTab++,
1bbe0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42   pItem++){.    B
1bbf0 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1bc00 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1bc10 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
1bc20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
1bc30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1bc40 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1bc50 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
1bc60 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
1bc70 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  ( ((pItem->fg.jo
1bc80 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
1bc90 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  type) & (JT_LEFT
1bca0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
1bcb0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1bcc0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
1bcd0 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20  e when pItem is 
1bce0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bcf0 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20  term on the.    
1bd00 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d    ** right-hand-
1bd10 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f  side of a LEFT o
1bd20 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a  r CROSS JOIN.  *
1bd30 2f 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  /.      mExtra =
1bd40 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
1bd50 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65     priorJointype
1bd60 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   = pItem->fg.joi
1bd70 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49  ntype;.    if( I
1bd80 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1bd90 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
1bda0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1bdb0 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  em *p;.      for
1bdc0 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c  (p=&pItem[1]; p<
1bdd0 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
1bde0 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c      if( mUnusabl
1bdf0 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e  e || (p->fg.join
1be00 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1be10 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20  JT_CROSS)) ){.  
1be20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c          mUnusabl
1be30 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  e |= sqlite3Wher
1be40 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
1be50 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  ->sMaskSet, p->i
1be60 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
1be70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1be80 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1be90 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
1bea0 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75  er, mExtra, mUnu
1beb0 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1bec0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
1bed0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1bee0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
1bef0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1bf00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1bf20 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1bf30 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55  lder, mExtra, mU
1bf40 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a  nusable);.    }.
1bf50 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
1bf60 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
1bf70 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
1bf80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1bf90 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65  reak;.  }..  whe
1bfa0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
1bfb0 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
1bfc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
1bfd0 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
1bfe0 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
1bff0 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
1c000 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
1c010 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
1c020 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
1c030 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
1c040 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1c050 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
1c060 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
1c070 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
1c080 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
1c090 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
1c0a0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
1c0b0 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
1c0c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c0d0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1c0e0 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
1c0f0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1c100 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
1c110 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
1c120 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
1c130 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
1c140 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
1c150 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
1c160 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
1c170 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
1c180 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
1c190 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
1c1a0 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
1c1b0 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
1c1c0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1c1d0 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
1c1e0 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
1c1f0 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
1c200 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
1c210 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
1c220 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
1c230 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
1c240 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
1c250 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
1c260 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
1c270 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1c280 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
1c290 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
1c2a0 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
1c2b0 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
1c2c0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1c2d0 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
1c2e0 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
1c2f0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
1c300 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
1c310 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
1c320 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1c330 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
1c340 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
1c350 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
1c360 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
1c370 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
1c380 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
1c390 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
1c3a0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1c3b0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1c3c0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
1c3d0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
1c3e0 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
1c3f0 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
1c400 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
1c410 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
1c420 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
1c430 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
1c440 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
1c450 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
1c460 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
1c470 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
1c480 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
1c490 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1c4a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1c4b0 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
1c4c0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
1c4d0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
1c4e0 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
1c4f0 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
1c500 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
1c510 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
1c520 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
1c530 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
1c540 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
1c550 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1c560 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
1c570 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
1c580 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
1c590 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
1c5a0 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
1c5b0 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
1c5c0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1c5d0 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
1c5e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c5f0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
1c600 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
1c610 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
1c620 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
1c630 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1c640 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
1c650 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
1c660 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
1c670 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
1c680 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
1c690 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
1c6a0 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
1c6b0 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
1c6c0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c6d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
1c6e0 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
1c6f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c700 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
1c710 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
1c720 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1c730 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c740 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
1c750 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1c760 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
1c770 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1c780 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
1c790 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c7a0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
1c7b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1c7c0 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
1c7d0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
1c7e0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
1c7f0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1c800 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c810 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1c820 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1c830 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1c840 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
1c850 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
1c860 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
1c870 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
1c880 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1c890 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
1c8a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1c8b0 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
1c8c0 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
1c8d0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
1c8e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1c8f0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
1c900 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
1c910 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1c920 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
1c930 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1c940 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
1c950 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c960 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
1c970 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
1c980 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
1c990 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
1c9a0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1c9b0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c9c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1c9d0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1c9e0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
1c9f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1ca00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1ca10 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
1ca20 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
1ca30 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
1ca40 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
1ca50 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1ca60 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
1ca70 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
1ca80 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
1ca90 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
1caa0 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
1cab0 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
1cac0 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
1cad0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
1cae0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
1caf0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb10 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
1cb20 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
1cb30 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
1cb40 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
1cb50 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
1cb60 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
1cb70 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
1cb80 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
1cb90 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
1cba0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1cbb0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1cbc0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
1cbd0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
1cbe0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
1cbf0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
1cc00 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
1cc10 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
1cc20 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
1cc30 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
1cc40 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
1cc50 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
1cc60 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
1cc70 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
1cc80 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
1cc90 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1cca0 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
1ccb0 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
1ccc0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
1ccd0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
1cce0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
1ccf0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
1cd00 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
1cd10 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
1cd20 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1cd30 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
1cd40 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
1cd50 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
1cd60 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
1cd70 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1cd80 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
1cd90 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
1cda0 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
1cdb0 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
1cdc0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
1cdd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cde0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
1cdf0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
1ce00 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
1ce10 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
1ce20 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
1ce30 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
1ce40 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
1ce50 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
1ce60 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
1ce70 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
1ce80 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
1ce90 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
1cea0 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
1ceb0 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
1cec0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
1ced0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1cee0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
1cef0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
1cf00 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
1cf10 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
1cf20 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
1cf30 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
1cf40 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
1cf50 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
1cf60 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
1cf70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1cf80 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
1cf90 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
1cfa0 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
1cfb0 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
1cfc0 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
1cfd0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1cfe0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
1cff0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
1d000 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1d010 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
1d020 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
1d030 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
1d040 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1d050 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
1d060 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
1d070 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
1d080 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
1d090 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
1d0a0 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
1d0b0 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
1d0c0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1d0d0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
1d0e0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
1d0f0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
1d100 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
1d110 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
1d120 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
1d130 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
1d140 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
1d150 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
1d160 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
1d170 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
1d180 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1d190 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
1d1a0 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
1d1b0 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
1d1c0 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28  : pLast;.    if(
1d1d0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1d1e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1d1f0 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
1d200 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
1d210 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
1d220 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
1d230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d240 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
1d250 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1d260 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
1d270 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
1d280 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
1d290 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
1d2a0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1d2b0 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
1d2c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1d2d0 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
1d2e0 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
1d2f0 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
1d300 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
1d310 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
1d320 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
1d330 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
1d340 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
1d350 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d360 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
1d370 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1d380 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1d390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1d3a0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
1d3b0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1d3c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1d3d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
1d3e0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
1d3f0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
1d400 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
1d410 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1d420 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1d430 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
1d440 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
1d450 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
1d460 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
1d470 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d490 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
1d4a0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30  _ISNULL|WO_IS, 0
1d4b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1d4c0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1d4d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
1d4e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
1d4f0 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
1d500 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
1d510 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
1d520 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
1d530 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70  , *z2;.        p
1d540 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1d550 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1d560 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1d570 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1d580 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
1d590 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
1d5a0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1d5b0 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d       z1 = pColl-
1d5c0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1d5d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1d5e0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1d5f0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d  o->pParse, pTerm
1d600 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1d610 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
1d620 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
1d630 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32  Coll;.        z2
1d640 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
1d650 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d660 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1d670 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  z2)!=0 ) continu
1d680 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
1d690 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
1d6a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
1d6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
1d6c0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
1d6d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1d6e0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1d6f0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
1d700 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
1d710 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1d720 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
1d730 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
1d740 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79   0;.        nKey
1d750 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
1d760 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20   nColumn = 1;.  
1d770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1d780 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1d790 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
1d7a0 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
1d7b0 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
1d7c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1d7d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d7e0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64    nKeyCol = pInd
1d7f0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  ex->nKeyCol;.   
1d800 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
1d810 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
1d820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d830 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c  nColumn==nKeyCol
1d840 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  +1 || !HasRowid(
1d850 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20  pIndex->pTable) 
1d860 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d870 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  t( pIndex->aiCol
1d880 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d  umn[nColumn-1]==
1d890 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20  XN_ROWID.       
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
1d8c0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29  pIndex->pTable))
1d8d0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
1d8e0 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e  rDistinct = IsUn
1d8f0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
1d900 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1d910 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
1d920 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
1d930 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
1d940 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
1d950 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
1d960 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
1d970 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
1d980 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d990 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
1d9a0 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
1d9b0 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
1d9c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1d9d0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
1d9e0 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
1d9f0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
1da00 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
1da10 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
1da20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
1da30 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
1da40 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1da50 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
1da60 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
1da70 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53      && pLoop->nS
1da80 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
1da90 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
1daa0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
1dab0 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
1dac0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29  O_ISNULL|WO_IS))
1dad0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
1dae0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
1daf0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
1db00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1db10 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1db20 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
1db30 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
1db40 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
1db50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
1db60 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
1db70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1db80 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
1db90 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
1dba0 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
1dbb0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
1dbc0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
1dbd0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
1dbe0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1dbf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1dc00 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
1dc10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
1dc20 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
1dc30 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1dc40 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
1dc50 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1dc60 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
1dc70 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
1dc80 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
1dc90 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
1dca0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1dcb0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
1dcc0 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  umn = XN_ROWID;.
1dcd0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
1dce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1dcf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75  .        /* An u
1dd00 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c  nconstrained col
1dd10 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62  umn that might b
1dd20 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61  e NULL means tha
1dd30 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  t this.        *
1dd40 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e  * WhereLoop is n
1dd50 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a  ot well-ordered.
1dd60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1dd70 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
1dd80 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20  stinct.         
1dd90 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  && iColumn>=0.  
1dda0 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f         && j>=pLo
1ddb0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
1ddc0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64           && pInd
1ddd0 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ex->pTable->aCol
1dde0 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  [iColumn].notNul
1ddf0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  l==0.        ){.
1de00 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
1de10 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
1de20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1de30 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52    /* Find the OR
1de40 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74  DER BY term that
1de50 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1de60 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a  the j-th column.
1de70 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
1de80 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b  e index and mark
1de90 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74   that ORDER BY t
1dea0 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20  erm off .       
1deb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63   */.        bOnc
1dec0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
1ded0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
1dee0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
1def0 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
1df00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1df10 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
1df20 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
1df30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
1df40 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
1df50 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1df60 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1df70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1df80 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
1df90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
1dfa0 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
1dfb0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
1dfc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1dfd0 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
1dfe0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
1dff0 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
1e000 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
1e010 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
1e020 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
1e030 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
1e040 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  n>=(-1) ){.     
1e050 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1e060 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1e070 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
1e080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
1e090 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1e0a0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e0c0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1e0d0 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
1e0e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1e0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e100 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1e110 70 72 43 6f 6d 70 61 72 65 28 70 4f 42 45 78 70  prCompare(pOBExp
1e120 72 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  r,pIndex->aColEx
1e130 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69  pr->a[j].pExpr,i
1e140 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Cur) ){.        
1e150 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e160 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e180 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
1e190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e1a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1e1b0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
1e1c0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
1e1d0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1e1e0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1e1f0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
1e200 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
1e210 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
1e220 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1e230 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
1e240 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1e250 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
1e260 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1e270 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
1e280 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1e290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1e2a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
1e2b0 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c  atch && (wctrlFl
1e2c0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
1e2d0 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
1e2e0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1e2f0 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  e the sort order
1e300 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69   is compatible i
1e310 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
1e320 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  ause..          
1e330 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
1e340 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
1e350 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
1e360 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1e370 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20  if( revSet ){.  
1e380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
1e390 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f  ev ^ revIdx)!=pO
1e3a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
1e3b0 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63 68  tOrder ) isMatch
1e3c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e3e0 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
1e3f0 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
1e400 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
1e410 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
1e420 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d  ) *pRevMask |= M
1e430 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20  ASKBIT(iLoop);. 
1e440 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65             revSe
1e450 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
1e460 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1e470 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
1e480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e490 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
1e4a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e4b0 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c  ase( distinctCol
1e4c0 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  umns==0 );.     
1e4d0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43         distinctC
1e4e0 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20  olumns = 1;.    
1e4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e500 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
1e510 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
1e520 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e530 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e  /* No match foun
1e540 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
1e550 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65  f( j==0 || j<nKe
1e560 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
1e570 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
1e580 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30  OrderDistinct!=0
1e590 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1e5a0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1e5b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1e5c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1e5d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e5e0 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
1e5f0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
1e600 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
1e610 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  if( distinctColu
1e620 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74  mns ){.        t
1e630 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
1e640 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
1e650 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1e660 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20  stinct = 1;.    
1e670 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64    }.    } /* end
1e680 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
1e690 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
1e6a0 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
1e6b0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
1e6c0 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
1e6d0 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
1e6e0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1e6f0 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
1e700 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
1e710 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
1e720 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1e730 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1e740 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
1e750 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
1e760 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
1e770 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
1e780 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
1e790 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
1e7a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
1e7b0 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20  ;.        mTerm 
1e7c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
1e7d0 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d  prUsage(&pWInfo-
1e7e0 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20  >sMaskSet,p);.  
1e7f0 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d        if( mTerm=
1e800 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
1e810 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20  prIsConstant(p) 
1e820 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e830 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e      if( (mTerm&~
1e840 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1e850 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
1e860 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
1e870 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
1e880 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e890 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c    } /* End the l
1e8a0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65  oop over all Whe
1e8b0 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74  reLoops from out
1e8c0 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20  er-most down to 
1e8d0 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20  inner-most */.  
1e8e0 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e  if( obSat==obDon
1e8f0 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e  e ) return (i8)n
1e900 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21  OrderBy;.  if( !
1e910 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1e920 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72  ){.    for(i=nOr
1e930 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d  derBy-1; i>0; i-
1e940 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  -){.      Bitmas
1e950 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29  k m = MASKBIT(i)
1e960 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   - 1;.      if( 
1e970 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72  (obSat&m)==m ) r
1e980 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20  eturn i;.    }. 
1e990 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1e9a0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1e9b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ../*.** If the W
1e9c0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
1e9d0 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  g is set in the 
1e9e0 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73  mask passed to s
1e9f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1ea00 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e  (),.** the plann
1ea10 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  er assumes that 
1ea20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f  the specified pO
1ea30 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61  rderBy list is a
1ea40 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a  ctually a GROUP.
1ea50 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61  ** BY clause - a
1ea60 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20  nd so any order 
1ea70 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73  that groups rows
1ea80 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74   as required sat
1ea90 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65  isfies the.** re
1eaa0 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  quest..**.** Nor
1eab0 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63  mally, in this c
1eac0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
1ead0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63  ssible for the c
1eae0 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69  aller to determi
1eaf0 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
1eb00 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72   not the rows ar
1eb10 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64  e really being d
1eb20 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74  elivered in sort
1eb30 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20  ed order, or.** 
1eb40 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68  just in some oth
1eb50 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72  er order that pr
1eb60 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69  ovides the requi
1eb70 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f  red grouping. Ho
1eb80 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65  wever,.** if the
1eb90 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
1eba0 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  UP flag is also 
1ebb0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1ebc0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74  3WhereBegin(), t
1ebd0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
1ebe0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
1ebf0 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  ed on the return
1ec00 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a  ed WhereInfo obj
1ec10 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a  ect. It returns.
1ec20 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72  ** true if the r
1ec30 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20  ows really will 
1ec40 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65  be sorted in the
1ec50 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72   specified order
1ec60 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74  , or false.** ot
1ec70 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46  herwise..**.** F
1ec80 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
1ec90 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  ming:.**.**   CR
1eca0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1ecb0 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a   t1(x, Y);.**.**
1ecc0 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45   then.**.**   SE
1ecd0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
1ece0 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45  ROUP BY x,y ORDE
1ecf0 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49  R BY x,y;   -- I
1ed00 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20  sSorted()==1.** 
1ed10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1ed20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20  t1 GROUP BY y,x 
1ed30 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20  ORDER BY y,x;   
1ed40 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30  -- IsSorted()==0
1ed50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
1ed60 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65  hereIsSorted(Whe
1ed70 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
1ed80 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
1ed90 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1eda0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
1edb0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
1edc0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1edd0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
1ede0 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  P );.  return pW
1edf0 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a  Info->sorted;.}.
1ee00 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1ee10 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f  CE_ENABLED./* Fo
1ee20 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  r debugging use 
1ee30 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20  only: */.static 
1ee40 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72  const char *wher
1ee50 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50  ePathName(WhereP
1ee60 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20  ath *pPath, int 
1ee70 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70  nLoop, WhereLoop
1ee80 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74   *pLast){.  stat
1ee90 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35  ic char zName[65
1eea0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ];.  int i;.  fo
1eeb0 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20  r(i=0; i<nLoop; 
1eec0 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d  i++){ zName[i] =
1eed0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d   pPath->aLoop[i]
1eee0 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70  ->cId; }.  if( p
1eef0 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b  Last ) zName[i++
1ef00 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a  ] = pLast->cId;.
1ef10 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a    zName[i] = 0;.
1ef20 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
1ef30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1ef40 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20  Return the cost 
1ef50 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20  of sorting nRow 
1ef60 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74  rows, assuming t
1ef70 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76  hat the keys hav
1ef80 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63  e .** nOrderby c
1ef90 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20  olumns and that 
1efa0 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65  the first nSorte
1efb0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c  d columns are al
1efc0 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65  ready in.** orde
1efd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  r..*/.static Log
1efe0 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67  Est whereSorting
1eff0 43 6f 73 74 28 0a 20 20 4c 6f 67 45 73 74 20 6e  Cost(.  LogEst n
1f000 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65  Row,.  int nOrde
1f010 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74  rBy,.  int nSort
1f020 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e  ed.){.  /* TUNIN
1f030 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73  G: Estimated cos
1f040 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65  t of a full exte
1f050 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65  rnal sort, where
1f060 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20   N is .  ** the 
1f070 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
1f080 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a  o sort is:.  **.
1f090 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
1f0a0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
1f0b0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c  ..  ** .  ** Or,
1f0c0 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   if the order-by
1f0d0 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65   clause has X te
1f0e0 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65  rms but only the
1f0f0 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65   last Y .  ** te
1f100 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f  rms are out of o
1f110 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b  rder, then block
1f120 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65  -sorting will re
1f130 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73  duce the .  ** s
1f140 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a  orting cost to:.
1f150 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74    **.  **   cost
1f160 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f   = (3.0 * N * lo
1f170 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20  g(N)) * (Y/X).  
1f180 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58  **.  ** The (Y/X
1f190 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d  ) term is implem
1f1a0 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63  ented using stac
1f1b0 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c  k variable rScal
1f1c0 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a  e.  ** below.  *
1f1d0 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c  /.  LogEst rScal
1f1e0 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20  e, rSortCost;.  
1f1f0 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1f200 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65  >0 && 66==sqlite
1f210 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
1f220 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74    rScale = sqlit
1f230 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72  e3LogEst((nOrder
1f240 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f  By-nSorted)*100/
1f250 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a  nOrderBy) - 66;.
1f260 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
1f270 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77  ow + estLog(nRow
1f280 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b  ) + rScale + 16;
1f290 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43  .  return rSortC
1f2a0 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ost;.}../*.** Gi
1f2b0 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ven the list of 
1f2c0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1f2d0 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  s at pWInfo->pLo
1f2e0 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ops, this routin
1f2f0 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  e.** attempts to
1f300 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   find the lowest
1f310 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20   cost path that 
1f320 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72  visits each Wher
1f330 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20  eLoop.** once.  
1f340 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65  This path is the
1f350 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  n loaded into th
1f360 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57  e pWInfo->a[].pW
1f370 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a  Loop fields..**.
1f380 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  ** Assume that t
1f390 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1f3a0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74  of output rows t
1f3b0 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
1f3c0 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69   be sorted.** wi
1f3d0 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69  ll be nRowEst (i
1f3e0 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65  n the 10*log2 re
1f3f0 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20  presentation).  
1f400 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69  Or, ignore sorti
1f410 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e  ng.** costs if n
1f420 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  RowEst==0..**.**
1f430 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1f440 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1f450 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
1f460 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1f470 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
1f480 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
1f490 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
1f4a0 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
1f4b0 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f  Info, LogEst nRo
1f4c0 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
1f4d0 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
1f4e0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
1f4f0 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
1f500 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
1f510 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
1f520 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1f530 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1f540 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
1f550 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
1f560 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1f570 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1f580 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
1f590 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1f5a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1f5b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1f5c0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1f5e0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
1f5f0 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
1f600 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
1f610 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
1f620 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1f630 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
1f640 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mxI = 0;        
1f650 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1f660 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20  f next entry to 
1f670 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74  replace */.  int
1f680 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
1f690 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f6a0 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61   of ORDER BY cla
1f6b0 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c  use terms */.  L
1f6c0 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30  ogEst mxCost = 0
1f6d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  ;        /* Maxi
1f6e0 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65  mum cost of a se
1f6f0 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
1f700 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65  LogEst mxUnsorte
1f710 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78  d = 0;    /* Max
1f720 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f  imum unsorted co
1f730 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
1f740 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ath */.  int nTo
1f750 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
1f760 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f770 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
1f780 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
1f790 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
1f7a0 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
1f7b0 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
1f7c0 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
1f7d0 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
1f7e0 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
1f7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f800 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
1f810 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
1f820 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
1f830 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
1f840 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
1f850 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
1f860 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
1f870 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
1f880 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
1f890 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
1f8a0 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
1f8b0 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
1f8c0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1f8d0 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
1f8e0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
1f8f0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
1f900 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f910 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
1f920 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
1f930 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
1f940 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ory */.  LogEst 
1f950 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20  *aSortCost = 0; 
1f960 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e     /* Sorting an
1f970 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e  d partial sortin
1f980 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61  g costs */.  cha
1f990 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
1f9a0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1f9b0 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
1f9c0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
1f9d0 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b  */.  int nSpace;
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9f0 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
1fa00 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53   allocated at pS
1fa10 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  pace */..  pPars
1fa20 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1fa30 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
1fa40 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
1fa50 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
1fa60 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
1fa70 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
1fa80 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
1fa90 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
1faa0 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
1fab0 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
1fac0 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
1fad0 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
1fae0 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
1faf0 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
1fb00 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
1fb10 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
1fb20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31  = (nLoop<=1) ? 1
1fb30 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
1fb40 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
1fb50 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
1fb60 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
1fb70 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
1fb80 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
1fb90 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52  gin solver.  (nR
1fba0 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52  owEst=%d)\n", nR
1fbb0 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49  owEst));..  /* I
1fbc0 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72  f nRowEst is zer
1fbd0 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  o and there is a
1fbe0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1fbf0 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e  e, ignore it. In
1fc00 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20   this.  ** case 
1fc10 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  the purpose of t
1fc20 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65  his call is to e
1fc30 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
1fc40 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72  er of rows retur
1fc50 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ned.  ** by the 
1fc60 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f  overall query. O
1fc70 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74  nce this estimat
1fc80 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  e has been obtai
1fc90 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a  ned, the caller.
1fca0 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65    ** will invoke
1fcb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1fcc0 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61   second time, pa
1fcd0 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61  ssing the estima
1fce0 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e  te as the.  ** n
1fcf0 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72  RowEst parameter
1fd00 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
1fd10 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
1fd20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
1fd30 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
1fd40 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1fd50 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66  nOrderBy = pWInf
1fd60 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
1fd70 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  pr;.  }..  /* Al
1fd80 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
1fd90 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
1fda0 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61  aTo, aFrom and a
1fdb0 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20  SortCost[] */.  
1fdc0 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66  nSpace = (sizeof
1fdd0 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
1fde0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
1fdf0 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
1fe00 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69  ;.  nSpace += si
1fe10 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
1fe20 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63  OrderBy;.  pSpac
1fe30 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
1fe40 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70  locRawNN(db, nSp
1fe50 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61  ace);.  if( pSpa
1fe60 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
1fe70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61  QLITE_NOMEM;.  a
1fe80 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a  To = (WherePath*
1fe90 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d  )pSpace;.  aFrom
1fea0 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b   = aTo+mxChoice;
1feb0 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c  .  memset(aFrom,
1fec0 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d   0, sizeof(aFrom
1fed0 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57  [0]));.  pX = (W
1fee0 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f  hereLoop**)(aFro
1fef0 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66  m+mxChoice);.  f
1ff00 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32  or(ii=mxChoice*2
1ff10 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e  , pFrom=aTo; ii>
1ff20 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b  0; ii--, pFrom++
1ff30 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a  , pX += nLoop){.
1ff40 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70      pFrom->aLoop
1ff50 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28   = pX;.  }.  if(
1ff60 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
1ff70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1ff80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1ff90 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  se and it is not
1ffa0 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20   being ignored, 
1ffb0 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70  set up.    ** sp
1ffc0 61 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72  ace for the aSor
1ffd0 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45  tCost[] array. E
1ffe0 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ach element of t
1fff0 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72  he aSortCost arr
20000 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74  ay.    ** is eit
20010 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69  her zero - meani
20020 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ng it has not ye
20030 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  t been initializ
20040 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20  ed - or the.    
20050 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  ** cost of sorti
20060 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20  ng nRowEst rows 
20070 6f 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68  of data where th
20080 65 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20  e first X terms 
20090 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52  of.    ** the OR
200a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
200b0 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64  e already in ord
200c0 65 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74  er, where X is t
200d0 68 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a  he array .    **
200e0 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20   index.  */.    
200f0 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67  aSortCost = (Log
20100 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d  Est*)pX;.    mem
20110 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30  set(aSortCost, 0
20120 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  , sizeof(LogEst)
20130 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20   * nOrderBy);.  
20140 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72  }.  assert( aSor
20150 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70  tCost==0 || &pSp
20160 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68  ace[nSpace]==(ch
20170 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e  ar*)&aSortCost[n
20180 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73  OrderBy] );.  as
20190 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21  sert( aSortCost!
201a0 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
201b0 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58  pace]==(char*)pX
201c0 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74   );..  /* Seed t
201d0 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61  he search with a
201e0 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74   single WherePat
201f0 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72  h containing zer
20200 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20  o WhereLoops..  
20210 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20  **.  ** TUNING: 
20220 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e  Do not let the n
20230 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
20240 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e  ons go above 28.
20250 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20    If the cost.  
20260 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ** of computing 
20270 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
20280 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62  ex is not paid b
20290 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66  ack within the f
202a0 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77  irst 28.  ** row
202b0 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75  s, then do not u
202c0 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  se the automatic
202d0 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72   index. */.  aFr
202e0 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e  om[0].nRow = MIN
202f0 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  (pParse->nQueryL
20300 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72  oop, 48);  asser
20310 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 48==sqlite3Lo
20320 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46  gEst(28) );.  nF
20330 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  rom = 1;.  asser
20340 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72  t( aFrom[0].isOr
20350 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  dered==0 );.  if
20360 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( nOrderBy ){.  
20370 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73    /* If nLoop is
20380 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72   zero, then ther
20390 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65  e are no FROM te
203a0 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  rms in the query
203b0 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69  . Since.    ** i
203c0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
203d0 71 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e  query may return
203e0 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e   a maximum of on
203f0 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c  e row, the resul
20400 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  ts.    ** are al
20410 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71  ready in the req
20420 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65  uested order. Se
20430 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e  t isOrdered to n
20440 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a  OrderBy to.    *
20450 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e  * indicate this.
20460 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73   Or, if nLoop is
20470 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
20480 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65  ro, set isOrdere
20490 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20  d to.    ** -1, 
204a0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
204b0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  the result set m
204c0 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
204d0 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a   ordered, .    *
204e0 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  * depending on t
204f0 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74  he loops added t
20500 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c  o the current pl
20510 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f  an.  */.    aFro
20520 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d  m[0].isOrdered =
20530 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20   nLoop>0 ? -1 : 
20540 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20  nOrderBy;.  }.. 
20550 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63   /* Compute succ
20560 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20  essively longer 
20570 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67  WherePaths using
20580 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65   the previous ge
20590 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66  neration.  ** of
205a0 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74   WherePaths as t
205b0 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65  he basis for the
205c0 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61   next.  Keep tra
205d0 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ck of the mxChoi
205e0 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74  ce.  ** best pat
205f0 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72  hs at each gener
20600 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69  ation */.  for(i
20610 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
20620 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
20630 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20     nTo = 0;.    
20640 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d  for(ii=0, pFrom=
20650 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b  aFrom; ii<nFrom;
20660 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b   ii++, pFrom++){
20670 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f  .      for(pWLoo
20680 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
20690 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70  ; pWLoop; pWLoop
206a0 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f  =pWLoop->pNextLo
206b0 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67  op){.        Log
206c0 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20  Est nOut;       
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206e0 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62  * Rows visited b
206f0 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  y (pFrom+pWLoop)
20700 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
20710 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20730 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70   Cost of path (p
20740 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
20750 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
20760 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20  Unsorted;       
20770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
20780 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70  orted cost of (p
20790 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
207a0 20 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64          i8 isOrd
207b0 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  ered = pFrom->is
207c0 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f  Ordered;  /* isO
207d0 72 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f  rdered for (pFro
207e0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
207f0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
20800 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  kNew;           
20810 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
20820 66 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79  f src visited by
20830 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20   (..) */.       
20840 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
20850 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20860 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65     /* Mask of re
20870 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f  v-order loops fo
20880 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20  r (..) */..     
20890 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
208a0 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
208b0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
208c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
208d0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
208e0 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
208f0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
20900 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20910 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
20920 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
20930 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
20940 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
20950 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
20960 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
20970 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
20980 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
20990 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74  Add(pWLoop->rSet
209a0 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20  up,pWLoop->rRun 
209b0 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a  + pFrom->nRow);.
209c0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
209d0 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
209e0 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20  tAdd(rUnsorted, 
209f0 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64  pFrom->rUnsorted
20a00 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  );.        nOut 
20a10 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20  = pFrom->nRow + 
20a20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  pWLoop->nOut;.  
20a30 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20        maskNew = 
20a40 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
20a50 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
20a60 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  lf;.        if( 
20a70 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20  isOrdered<0 ){. 
20a80 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
20a90 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  ed = wherePathSa
20aa0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
20ab0 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  WInfo,.         
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
20ad0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
20ae0 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77  pFrom, pWInfo->w
20af0 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20  ctrlFlags,.     
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c    iLoop, pWLoop,
20b20 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20   &revMask);.    
20b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b40 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70       revMask = p
20b50 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
20b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20b70 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d   if( isOrdered>=
20b80 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e  0 && isOrdered<n
20b90 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
20ba0 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f       if( aSortCo
20bb0 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30  st[isOrdered]==0
20bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20bd0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
20be0 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74  red] = whereSort
20bf0 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20  ingCost(.       
20c00 20 20 20 20 20 20 20 20 20 6e 52 6f 77 45 73 74           nRowEst
20c10 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72  , nOrderBy, isOr
20c20 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20  dered.          
20c30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
20c40 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74  .          rCost
20c50 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
20c60 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61  Add(rUnsorted, a
20c70 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
20c80 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ed]);..         
20c90 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
20ca0 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
20cb0 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73   ("---- sort cos
20cc0 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69  t=%-3d (%d/%d) i
20cd0 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33  ncreases cost %3
20ce0 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20  d to %-3d\n",.  
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f               aSo
20d00 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20d10 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f  ], (nOrderBy-isO
20d20 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42  rdered), nOrderB
20d30 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  y, .            
20d40 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43     rUnsorted, rC
20d50 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ost));.        }
20d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20d70 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65  rCost = rUnsorte
20d80 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  d;.        }..  
20d90 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
20da0 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20  o see if pWLoop 
20db0 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20  should be added 
20dc0 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20  to the set of.  
20dd0 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63        ** mxChoic
20de0 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  e best-so-far pa
20df0 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ths..        **.
20e00 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74          ** First
20e10 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   look for an exi
20e20 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67  sting path among
20e30 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
20e40 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  hs.        ** th
20e50 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61  at covers the sa
20e60 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
20e70 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
20e80 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
20e90 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73     ** setting as
20ea0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74   the current pat
20eb0 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20  h candidate..   
20ec0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
20ed0 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70  ** The term "((p
20ee0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73  To->isOrdered^is
20ef0 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d  Ordered)&0x80)==
20f00 30 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  0" is equivalent
20f10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28  .        ** to (
20f20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  pTo->isOrdered==
20f30 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65  (-1))==(isOrdere
20f40 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68  d==(-1))" for th
20f50 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  e range.        
20f60 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75  ** of legal valu
20f70 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64  es for isOrdered
20f80 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20  , -1..64..      
20f90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72    */.        for
20fa0 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (jj=0, pTo=aTo; 
20fb0 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54  jj<nTo; jj++, pT
20fc0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
20fd0 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f  if( pTo->maskLoo
20fe0 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20  p==maskNew.     
20ff0 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e        && ((pTo->
21000 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
21010 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20  red)&0x80)==0.  
21020 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21030 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21040 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20   jj==nTo-1 );.  
21050 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21060 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21080 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20  f( jj>=nTo ){.  
21090 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20          /* None 
210a0 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  of the existing 
210b0 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
210c0 73 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64  s match the cand
210d0 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  idate. */.      
210e0 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
210f0 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
21100 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73   && (rCost>mxCos
21110 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43  t || (rCost==mxC
21120 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64  ost && rUnsorted
21130 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20  >=mxUnsorted)). 
21140 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
21150 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
21160 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65  urrent candidate
21170 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68   is no better th
21180 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78  an any of the mx
21190 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20  Choice.         
211a0 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72     ** paths curr
211b0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73  ently in the bes
211c0 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e  t-so-far buffer.
211d0 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20    So discard.   
211e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
211f0 20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f   candidate as no
21200 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66  t viable. */.#if
21210 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
21220 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
21230 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21240 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
21250 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
21260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
21270 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
21280 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
21290 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
212a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
212b0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
212c0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
212d0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
212e0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
212f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
21300 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
21310 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
21320 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
21330 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
21340 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21350 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
21360 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
21370 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73   points it means
21380 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 61   that the new ca
21390 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20 20 20  ndidate path.   
213a0 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20         ** needs 
213b0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
213c0 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73  he set of best-s
213d0 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a  o-far paths. */.
213e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
213f0 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  o<mxChoice ){.  
21400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
21410 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
21420 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79  f the aTo set by
21430 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20   one */.        
21440 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a      jj = nTo++;.
21450 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
21460 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
21470 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65  New path replace
21480 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73  s the prior wors
21490 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20  t to keep count 
214a0 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a  below mxChoice *
214b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
214c0 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20   = mxI;.        
214d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
214e0 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69  o = &aTo[jj];.#i
214f0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
21500 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
21510 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
21520 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
21530 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
21540 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
21550 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
21560 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
21570 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
21590 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
215a0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
215b0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215d0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
215e0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
215f0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
21600 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
21610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21620 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63   /* Control reac
21630 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73 74  hes here if best
21640 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f  -so-far path pTo
21650 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20  =aTo[jj] covers 
21660 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
21670 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
21680 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
21690 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73 65 74  am isOrdered set
216a0 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20  ting as the.    
216b0 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61        ** candida
216c0 74 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20  te path.  Check 
216d0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 61  to see if the ca
216e0 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72  ndidate should r
216f0 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20  eplace.         
21700 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68   ** pTo or if th
21710 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75  e candidate shou
21720 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f  ld be skipped */
21730 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
21740 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20  To->rCost<rCost 
21750 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
21760 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52  rCost && pTo->nR
21770 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66  ow<=nOut) ){.#if
21780 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
21790 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
217a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
217b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
217c0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
217d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
217e0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
21800 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
21810 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
21820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21830 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
21840 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
21850 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
21860 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
21870 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
21880 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
21890 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
218a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
218b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
218c0 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
218d0 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  d,%d order=%c\n"
218e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
218f0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
21900 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
21910 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
21920 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
21940 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
21950 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
21960 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
21970 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
21980 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
21990 44 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64  Discard the cand
219a0 69 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20  idate path from 
219b0 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72  further consider
219c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
219d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
219e0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
219f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21a00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21a20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
21a30 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b  Cost==rCost+1 );
21a40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
21a50 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
21a60 72 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  re if the candid
21a70 61 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74  ate path is bett
21a80 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
21a90 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74        ** pTo pat
21aa0 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20  h.  Replace pTo 
21ab0 77 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61  with the candida
21ac0 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  te. */.#ifdef WH
21ad0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
21ae0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
21af0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21b00 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
21b10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
21b20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21b30 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
21b40 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73    "Update %s cos
21b50 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
21b60 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
21b70 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21b80 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
21b90 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
21ba0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
21bb0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
21bc0 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
21bd0 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
21be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21bf0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77  DebugPrintf("  w
21c00 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  as %s cost=%-3d,
21c10 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
21c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21c30 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
21c40 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
21c50 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
21c60 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
21c70 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
21c80 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
21c90 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
21ca0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
21cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21cc0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70    }.        /* p
21cd0 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65  WLoop is a winne
21ce0 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68  r.  Add it to th
21cf0 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f  e set of best so
21d00 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
21d10 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20  pTo->maskLoop = 
21d20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
21d30 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
21d40 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  lf;.        pTo-
21d50 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61  >revLoop = revMa
21d60 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  sk;.        pTo-
21d70 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nRow = nOut;.  
21d80 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
21d90 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
21da0 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64    pTo->rUnsorted
21db0 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
21dc0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
21dd0 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
21de0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
21df0 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
21e00 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
21e10 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
21e20 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
21e30 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
21e40 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
21e50 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
21e60 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
21e70 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20   mxI = 0;.      
21e80 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
21e90 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
21ea0 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20       mxUnsorted 
21eb0 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
21ec0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
21ed0 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
21ee0 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
21ef0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
21f00 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
21f10 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20  rCost>mxCost .  
21f20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
21f30 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  To->rCost==mxCos
21f40 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
21f50 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20  ted>mxUnsorted) 
21f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
21f80 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
21f90 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
21fa0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54   mxUnsorted = pT
21fb0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20  o->rUnsorted;.  
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20              mxI 
21fd0 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  = jj;.          
21fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22000 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
22010 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
22020 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20  ED  /* >=2 */.  
22030 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
22040 72 65 54 72 61 63 65 20 26 20 30 78 30 32 20 29  reTrace & 0x02 )
22050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
22060 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
22070 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
22080 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
22090 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
220a0 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
220b0 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
220c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
220d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
220e0 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
220f0 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
22100 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
22110 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
22120 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
22130 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
22140 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
22150 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
22160 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b  (pTo->isOrdered+
22170 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  '0') : '?');.   
22180 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73       if( pTo->is
22190 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20  Ordered>0 ){.   
221a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
221b0 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
221c0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
221d0 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
221e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
221f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22200 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
22210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22220 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
22230 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
22240 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
22250 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
22260 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
22270 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
22280 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
22290 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
222a0 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
222b0 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
222c0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
222d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
222e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
222f0 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
22300 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22310 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
22320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22330 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
22340 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
22350 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
22360 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
22370 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
22380 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
22390 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
223a0 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
223b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
223c0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
223d0 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
223e0 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
223f0 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
22400 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
22410 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
22420 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
22430 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
22440 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
22450 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
22460 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
22470 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
22480 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
22490 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
224a0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
224b0 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
224c0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
224d0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
224e0 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
224f0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
22500 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
22510 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
22520 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
22530 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
22540 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22550 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
22560 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
22570 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22580 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
22590 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
225a0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
225b0 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
225c0 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
225d0 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
225e0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
225f0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
22600 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
22610 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
22620 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
22630 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
22640 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
22650 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
22660 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
22670 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
22680 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
22690 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  c==pWInfo->pResu
226a0 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  ltSet->nExpr ){.
226b0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
226c0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
226d0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
226e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
226f0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
22700 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57  By ){.    if( pW
22710 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22720 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
22730 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28  TBY ){.      if(
22740 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
22750 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  d==pWInfo->pOrde
22760 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
22770 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
22780 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
22790 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
227a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
227b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  lse{.      pWInf
227c0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f  o->nOBSat = pFro
227d0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  m->isOrdered;.  
227e0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
227f0 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49 6e 66  nOBSat<0 ) pWInf
22800 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
22810 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
22820 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
22830 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  vLoop;.    }.   
22840 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
22850 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
22860 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20  _SORTBYGROUP).  
22870 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d        && pWInfo-
22880 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d  >nOBSat==pWInfo-
22890 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
228a0 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20   && nLoop>0.    
228b0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
228c0 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
228d0 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d      int nOrder =
228e0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
228f0 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
22900 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  o, pWInfo->pOrde
22910 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
22920 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d  pFrom, 0, nLoop-
22930 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
22940 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61  nLoop-1], &revMa
22950 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sk.      );.    
22960 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
22970 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20  ->sorted==0 );. 
22980 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d       if( nOrder=
22990 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
229a0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
229b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74      pWInfo->sort
229c0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
229d0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
229e0 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
229f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20   }.    }.  }... 
22a00 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
22a10 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a   = pFrom->nRow;.
22a20 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f  .  /* Free tempo
22a30 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20  rary memory and 
22a40 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a  return success *
22a50 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
22a60 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
22a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22a80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74  K;.}../*.** Most
22a90 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c   queries use onl
22aa0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
22ab0 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a   (they are not j
22ac0 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a  oins) and have.*
22ad0 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73  * simple == cons
22ae0 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20  traints against 
22af0 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20  indexed fields. 
22b00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
22b10 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61  tempts.** to pla
22b20 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63  n those simple c
22b30 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20  ases using much 
22b40 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68  less ceremony th
22b50 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61  an the.** genera
22b60 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
22b70 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65  planner, and the
22b80 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65  reby yield faste
22b90 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
22ba0 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72  e().** times for
22bb0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
22bc0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
22bd0 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  on-zero on succe
22be0 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72  ss, if this quer
22bf0 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64  y can be handled
22c00 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66   by this.** no-f
22c10 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e  rills query plan
22c20 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ner.  Return zer
22c30 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  o if this query 
22c40 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65  needs the .** ge
22c50 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
22c60 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  ery planner..*/.
22c70 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
22c80 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f  ShortCut(WhereLo
22c90 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
22ca0 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
22cb0 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72  o *pWInfo;.  str
22cc0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22cd0 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65   *pItem;.  Where
22ce0 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
22cf0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
22d00 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
22d10 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  oop;.  int iCur;
22d20 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c  .  int j;.  Tabl
22d30 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
22d40 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49   *pIdx;.  .  pWI
22d50 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
22d60 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57  pWInfo;.  if( pW
22d70 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22d80 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
22d90 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b  ABLE ) return 0;
22da0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
22db0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
22dc0 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20  c>=1 );.  pItem 
22dd0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
22de0 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20  st->a;.  pTab = 
22df0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69  pItem->pTab;.  i
22e00 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
22e10 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
22e20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
22e30 73 49 6e 64 65 78 65 64 42 79 20 29 20 72 65 74  sIndexedBy ) ret
22e40 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
22e50 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
22e60 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
22e70 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
22e80 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
22e90 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
22ea0 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e   = 0;.  pLoop->n
22eb0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72  Skip = 0;.  pTer
22ec0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
22ed0 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
22ee0 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
22ef0 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66  |WO_IS, 0);.  if
22f00 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74  ( pTerm ){.    t
22f10 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22f20 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
22f30 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  S );.    pLoop->
22f40 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
22f50 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
22f60 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
22f70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
22f80 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
22f90 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
22fa0 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
22fb0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
22fc0 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
22fd0 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
22fe0 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
22ff0 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
23000 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
23010 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
23020 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
23030 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
23040 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
23050 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
23060 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61  {.      int opMa
23070 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sk;.      assert
23080 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  ( pLoop->aLTermS
23090 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  pace==pLoop->aLT
230a0 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  erm );.      if(
230b0 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
230c0 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20  pIdx).       || 
230d0 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
230e0 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c  ere!=0 .       |
230f0 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  | pIdx->nKeyCol>
23100 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
23110 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20  >aLTermSpace) . 
23120 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b       ) continue;
23130 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  .      opMask = 
23140 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
23150 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  l ? (WO_EQ|WO_IS
23160 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20  ) : WO_EQ;.     
23170 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
23180 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
23190 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
231a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
231b0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
231c0 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70   j, 0, opMask, p
231d0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
231e0 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
231f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ak;.        test
23200 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
23210 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
23220 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
23230 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65  >aLTerm[j] = pTe
23240 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
23250 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e    if( j!=pIdx->n
23260 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
23270 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  e;.      pLoop->
23280 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
23290 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
232a0 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44  ONEROW|WHERE_IND
232b0 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  EXED;.      if( 
232c0 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  pIdx->isCovering
232d0 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55   || (pItem->colU
232e0 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
232f0 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20  Index(pIdx))==0 
23300 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
23310 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
23320 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
23330 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70     }.      pLoop
23340 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20  ->nLTerm = j;.  
23350 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
23360 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20  ee.nEq = j;.    
23370 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
23380 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
23390 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
233a0 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75   Cost of a uniqu
233b0 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69  e index lookup i
233c0 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c  s 15 */.      pL
233d0 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20  oop->rRun = 39; 
233e0 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c   /* 39==sqlite3L
233f0 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  ogEst(15) */.   
23400 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23410 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
23420 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
23430 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
23440 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49  ogEst)1;.    pWI
23450 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
23460 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   = pLoop;.    pL
23470 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
23480 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
23490 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
234a0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
234b0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
234c0 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
234d0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
234e0 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
234f0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
23500 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
23510 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
23520 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
23530 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
23540 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23550 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
23560 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
23570 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
23580 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
23590 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
235a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
235b0 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
235c0 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
235d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
235e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
235f0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
23600 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
23610 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
23620 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23630 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
23640 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
23650 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
23660 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
23670 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
23680 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
23690 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
236a0 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
236b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
236c0 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
236d0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
236e0 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
236f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
23700 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
23710 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
23720 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
23730 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
23740 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
23750 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
23760 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
23770 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
23780 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
23790 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
237a0 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
237b0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
237c0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
237d0 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
237e0 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
237f0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
23800 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
23810 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
23820 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
23830 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
23840 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
23850 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
23860 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
23870 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
23880 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
23890 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
238a0 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
238b0 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
238c0 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
238d0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
238e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
238f0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
23900 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
23910 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
23920 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
23930 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
23940 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
23950 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
23960 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
23970 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
23980 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
23990 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
239a0 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
239b0 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
239c0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
239d0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
23a00 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
23a10 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
23a30 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
23a40 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
23a50 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
23a60 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
23a70 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
23a80 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
23a90 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
23aa0 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
23ab0 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
23ac0 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
23ad0 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
23ae0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
23af0 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
23b00 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
23b10 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
23b20 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
23b30 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
23b40 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
23b50 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
23b60 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
23b70 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
23b80 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
23b90 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
23ba0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
23bb0 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
23bc0 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
23bd0 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
23be0 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
23bf0 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
23c00 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
23c10 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
23c20 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
23c30 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
23c40 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
23c50 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
23c60 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
23c70 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
23c80 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
23c90 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
23ca0 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
23cb0 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
23cc0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
23cd0 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
23ce0 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
23cf0 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
23d00 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
23d10 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
23d20 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
23d30 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
23d40 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
23d50 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
23d60 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
23d70 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
23d80 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
23d90 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
23da0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
23db0 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
23dc0 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
23dd0 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
23de0 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
23df0 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
23e00 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
23e10 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
23e20 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
23e30 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
23e40 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
23e50 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
23e60 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
23e70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
23e80 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
23e90 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
23ea0 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
23eb0 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
23ec0 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
23ed0 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
23ee0 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
23ef0 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
23f00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23f10 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
23f20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
23f30 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
23f40 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
23f50 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
23f60 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
23f70 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
23f80 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
23f90 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
23fa0 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
23fb0 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
23fc0 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
23fd0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
23fe0 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
23ff0 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
24000 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
24010 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
24020 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
24030 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
24040 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
24050 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
24060 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
24070 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
24080 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
24090 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
240a0 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
240b0 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
240c0 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
240d0 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
240e0 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
240f0 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
24100 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
24110 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
24120 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
24130 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
24140 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
24150 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
24160 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
24170 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
24180 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
24190 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
241a0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
241b0 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
241c0 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
241d0 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
241e0 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
241f0 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
24200 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
24210 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
24220 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
24230 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
24240 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
24250 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
24260 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
24270 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
24280 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
24290 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
242a0 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
242b0 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
242c0 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
242d0 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
242e0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
242f0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
24300 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
24310 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
24320 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
24330 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
24340 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
24350 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
24360 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
24370 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
24380 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72   The iIdxCur par
24390 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
243a0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
243b0 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a  n index.  If .**
243c0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
243d0 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64  ONLY is set, iId
243e0 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
243f0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
24400 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
24410 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
24420 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
24430 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
24440 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
24450 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
24460 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
24470 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
24480 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
24490 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
244a0 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
244b0 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
244c0 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
244d0 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
244e0 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
244f0 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
24500 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
24510 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
24520 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
24530 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
24540 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
24550 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24560 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
24570 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
24580 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
24590 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
245a0 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
245b0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
245c0 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
245d0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
245e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
245f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
24600 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
24610 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
24620 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
24630 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
24640 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
24650 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f  t *pResultSet, /
24660 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20  * Result set of 
24670 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75  the query */.  u
24680 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
24690 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
246a0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
246b0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
246c0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
246d0 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
246e0 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
246f0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
24700 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
24710 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
24720 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
24730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24740 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
24750 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
24760 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
24770 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
24780 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24790 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
247a0 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
247b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
247c0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
247d0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
247e0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
247f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
24800 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24810 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
24820 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
24830 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
24840 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
24850 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
24860 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
24870 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
24880 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
24890 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
248a0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
248b0 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
248c0 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
248d0 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
248e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
248f0 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
24900 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
24910 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
24920 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
24930 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
24940 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
24950 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
24960 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
24970 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
24980 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
249a0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
249b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
249d0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
249e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
249f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24a00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24a10 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f  code */.  u8 bFo
24a20 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  rdelete = 0;    
24a30 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46       /* OPFLAG_F
24a40 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f  ORDELETE or zero
24a50 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
24a60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
24a70 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24a80 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
24a90 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20  ROW)==0 || (.   
24aa0 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73       (wctrlFlags
24ab0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
24ac0 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20  _DESIRED)!=0 .  
24ad0 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
24ae0 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
24af0 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 0a 20  PEN_CLOSE)==0 . 
24b00 20 29 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61   ));..  /* Varia
24b10 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
24b20 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
24b30 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
24b40 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
24b50 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
24b60 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
24b70 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
24b80 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
24b90 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
24ba0 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
24bb0 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
24bc0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
24bd0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
24be0 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
24bf0 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
24c00 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
24c10 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
24c20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
24c30 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
24c40 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
24c50 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
24c60 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
24c70 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
24c80 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
24c90 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
24ca0 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
24cb0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
24cc0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
24cd0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
24ce0 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
24cf0 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
24d00 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
24d10 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
24d20 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
24d30 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
24d40 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
24d50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
24d60 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
24d70 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
24d80 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
24d90 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
24da0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
24db0 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
24dc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24dd0 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
24de0 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
24df0 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
24e00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
24e10 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
24e20 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
24e30 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
24e40 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
24e50 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
24e60 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
24e70 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
24e80 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
24e90 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
24ea0 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
24eb0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
24ec0 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
24ed0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
24ee0 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
24ef0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
24f00 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
24f10 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
24f20 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
24f30 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
24f40 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
24f50 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
24f60 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
24f70 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
24f80 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
24f90 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
24fa0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
24fb0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
24fc0 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
24fd0 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
24fe0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
24ff0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
25000 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
25010 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
25020 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
25030 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
25040 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
25050 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
25060 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
25070 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
25080 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
25090 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
250a0 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
250b0 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
250c0 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
250d0 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
250e0 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
250f0 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
25100 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
25110 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
25120 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
25130 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
25140 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
25150 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
25160 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
25170 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
25180 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
25190 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
251a0 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
251b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
251c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
251d0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
251e0 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
251f0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
25200 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
25210 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
25220 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
25230 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
25240 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
25250 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
25260 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
25270 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
25280 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
25290 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
252a0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
252b0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
252c0 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
252d0 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  t = pResultSet;.
252e0 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
252f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74   = pWInfo->iCont
25300 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
25310 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
25320 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
25330 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
25340 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
25350 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
25360 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
25370 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  p;.  assert( pWI
25380 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
25390 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f  NEPASS_OFF );  /
253a0 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c  * ONEPASS defaul
253b0 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70  ts to OFF */.  p
253c0 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
253d0 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
253e0 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
253f0 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
25400 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
25410 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
25420 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
25430 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
25440 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
25450 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
25460 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
25470 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
25480 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
25490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
254a0 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
254b0 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
254c0 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
254d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
254e0 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
254f0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
25500 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
25510 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
25520 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
25530 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
25540 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
25550 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
25560 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49  ite3WhereClauseI
25570 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
25580 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
25590 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26  ite3WhereSplit(&
255a0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
255b0 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  ere, TK_AND);.  
255c0 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
255d0 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
255e0 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
255f0 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
25600 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
25610 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
25620 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
25630 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
25640 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66  l thru..  */.  f
25650 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42  or(ii=0; ii<sWLB
25660 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  .pWC->nTerm; ii+
25670 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62  +){.    if( nTab
25680 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
25690 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
256a0 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43  NotJoin(sWLB.pWC
256b0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
256c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
256d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
256e0 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  e, sWLB.pWC->a[i
256f0 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f  i].pExpr, pWInfo
25700 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20  ->iBreak,.      
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
25730 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c  NULL);.      sWL
25740 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46  B.pWC->a[ii].wtF
25750 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
25760 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
25770 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
25780 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
25790 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
257a0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
257b0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
257c0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
257d0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
257e0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
257f0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
25800 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
25810 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
25820 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
25830 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
25840 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
25850 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
25860 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
25870 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
25880 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
25890 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20  *.  ** The N-th 
258a0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
258b0 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69 67   clause is assig
258c0 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66  ned a bitmask of
258d0 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   1<<N..  **.  **
258e0 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65   The rule of the
258f0 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
25900 63 65 20 65 6e 73 75 72 65 73 20 74 68 74 61 20  ce ensures thta 
25910 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
25920 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74  ask for.  ** a t
25930 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31  able T, then X-1
25940 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
25950 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  for all other ta
25960 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
25970 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77   of T..  ** Know
25980 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
25990 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
259a0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
259b0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a  left join is.  *
259c0 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  * important.  Ti
259d0 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
259e0 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
259f0 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
25a00 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
25a10 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
25a20 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
25a30 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
25a40 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
25a50 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
25a60 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
25a70 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
25a80 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
25a90 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
25aa0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
25ab0 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
25ac0 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
25ad0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
25ae0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
25af0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
25b00 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
25b10 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
25b20 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
25b30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  );.    sqlite3Wh
25b40 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70  ereTabFuncArgs(p
25b50 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74  Parse, &pTabList
25b60 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f  ->a[ii], &pWInfo
25b70 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64  ->sWC);.  }.#ifd
25b80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25b90 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25ba0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
25bb0 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  i++){.    Bitmas
25bc0 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  k m = sqlite3Whe
25bd0 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  reGetMask(pMaskS
25be0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
25bf0 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
25c00 20 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53    assert( m==MAS
25c10 4b 42 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a  KBIT(ii) );.  }.
25c20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
25c30 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
25c40 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
25c50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
25c60 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61  eExprAnalyze(pTa
25c70 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
25c80 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
25c90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
25ca0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
25cb0 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72  ror;..  if( wctr
25cc0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
25cd0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
25ce0 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
25cf0 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
25d00 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
25d10 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
25d20 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
25d30 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
25d40 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
25d50 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
25d60 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
25d70 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
25d80 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
25d90 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
25da0 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
25db0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
25dc0 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
25dd0 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
25de0 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
25df0 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
25e00 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
25e10 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
25e20 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
25e30 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
25e40 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
25e50 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
25e60 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
25e70 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
25e80 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54  ects */.  WHERET
25e90 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
25ea0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
25eb0 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67  t *** (wctrlFlag
25ec0 73 3a 20 30 78 25 78 29 5c 6e 22 2c 0a 20 20 20  s: 0x%x)\n",.   
25ed0 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46            wctrlF
25ee0 6c 61 67 73 29 29 3b 0a 23 69 66 20 64 65 66 69  lags));.#if defi
25ef0 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
25f00 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71  NABLED).  if( sq
25f10 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
25f20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69  & 0x100 ){ /* Di
25f30 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20  splay all terms 
25f40 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
25f50 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  use */.    int i
25f60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
25f70 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
25f80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ; i++){.      wh
25f90 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73 57  ereTermPrint(&sW
25fa0 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29  LB.pWC->a[i], i)
25fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
25fc0 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69  if..  if( nTabLi
25fd0 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68  st!=1 || whereSh
25fe0 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30  ortCut(&sWLB)==0
25ff0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   ){.    rc = whe
26000 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57  reLoopAddAll(&sW
26010 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  LB);.    if( rc 
26020 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
26030 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65  nError;.  .#ifde
26040 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26050 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
26060 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
26070 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20  {    /* Display 
26080 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65  all of the Where
26090 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
260a0 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
260b0 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  *p;.      int i;
260c0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
260d0 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b  nst char zLabel[
260e0 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
260f0 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
26100 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20  rstuvwyxz".     
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47          "ABCDEFG
26140 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
26150 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  YXZ";.      for(
26160 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
26170 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70  , i=0; p; p=p->p
26180 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a  NextLoop, i++){.
26190 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d          p->cId =
261a0 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66   zLabel[i%sizeof
261b0 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20  (zLabel)];.     
261c0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
261d0 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  t(p, sWLB.pWC);.
261e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
261f0 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72  ndif.  .    wher
26200 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
26210 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
26220 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26230 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
26240 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  inError;.    if(
26250 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
26260 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72  y ){.       wher
26270 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
26280 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  fo, pWInfo->nRow
26290 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69  Out+1);.       i
262a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
262b0 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
262c0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
262d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
262e0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
262f0 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
26300 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
26310 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  der)!=0 ){.     
26320 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
26330 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b  = (Bitmask)(-1);
26340 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
26350 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52  e->nErr || NEVER
26360 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
26370 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  d) ){.    goto w
26380 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
26390 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45    }.#ifdef WHERE
263a0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
263b0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
263c0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  Trace ){.    sql
263d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
263e0 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e  "---- Solution n
263f0 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d  Row=%d", pWInfo-
26400 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69  >nRowOut);.    i
26410 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
26420 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
26430 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26440 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25  " ORDERBY=%d,0x%
26450 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f  llx", pWInfo->nO
26460 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65  BSat, pWInfo->re
26470 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  vMask);.    }.  
26480 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f    switch( pWInfo
26490 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ->eDistinct ){. 
264a0 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
264b0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
264c0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
264d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
264e0 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65   DISTINCT=unique
264f0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
26500 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26510 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
26520 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
26530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
26540 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
26550 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29  STINCT=ordered")
26560 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
26580 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
26590 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a  CT_UNORDERED: {.
265a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
265b0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
265c0 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64  STINCT=unordered
265d0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
265e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
265f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26600 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
26610 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
26620 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
26630 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
26640 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
26650 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
26660 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
26670 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
26680 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d  /* Attempt to om
26690 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74  it tables from t
266a0 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20  he join that do 
266b0 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72  not effect the r
266c0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70  esult */.  if( p
266d0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
266e0 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65  .   && pResultSe
266f0 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  t!=0.   && Optim
26700 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
26710 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f  b, SQLITE_OmitNo
26720 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20  opJoin).  ){.   
26730 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64   Bitmask tabUsed
26740 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
26750 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61  xprListUsage(pMa
26760 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65  skSet, pResultSe
26770 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42  t);.    if( sWLB
26780 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
26790 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71     tabUsed |= sq
267a0 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
267b0 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  stUsage(pMaskSet
267c0 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29  , sWLB.pOrderBy)
267d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
267e0 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  e( pWInfo->nLeve
267f0 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68  l>=2 ){.      Wh
26800 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
26810 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f  *pEnd;.      pLo
26820 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70  op = pWInfo->a[p
26830 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d  WInfo->nLevel-1]
26840 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  .pWLoop;.      i
26850 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62  f( (pWInfo->pTab
26860 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
26870 54 61 62 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  Tab].fg.jointype
26880 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
26890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
268a0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
268b0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
268c0 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
268d0 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
268e0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
268f0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
26900 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26910 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
26920 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
26930 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
26940 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
26950 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
26960 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
26970 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
26980 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
26990 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
269a0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
269b0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
269c0 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
269d0 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
269e0 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
269f0 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
26a00 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
26a10 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
26a20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26a40 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
26a50 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
26a60 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
26a70 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
26a80 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
26a90 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
26aa0 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
26ab0 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
26ac0 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
26ad0 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
26ae0 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
26af0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
26b00 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
26b10 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
26b20 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
26b30 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
26b40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
26b50 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
26b60 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
26b70 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
26b80 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
26b90 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
26ba0 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
26bb0 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
26bc0 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2f  ppropriate..  */
26bd0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
26be0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26bf0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
26c00 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
26c10 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
26c20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
26c30 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
26c40 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  IRED)!=0 ){.    
26c50 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57  int wsFlags = pW
26c60 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
26c70 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
26c80 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77  int bOnerow = (w
26c90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
26ca0 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69  NEROW)!=0;.    i
26cb0 66 28 20 62 4f 6e 65 72 6f 77 0a 20 20 20 20 20  f( bOnerow.     
26cc0 7c 7c 20 28 28 77 63 74 72 6c 46 6c 61 67 73 20  || ((wctrlFlags 
26cd0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
26ce0 4d 55 4c 54 49 52 4f 57 29 21 3d 30 0a 20 20 20  MULTIROW)!=0.   
26cf0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 28 77          && 0==(w
26d00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
26d10 49 52 54 55 41 4c 54 41 42 4c 45 29 29 0a 20 20  IRTUALTABLE)).  
26d20 20 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66    ){.      pWInf
26d30 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f  o->eOnePass = bO
26d40 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f  nerow ? ONEPASS_
26d50 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53  SINGLE : ONEPASS
26d60 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66  _MULTI;.      if
26d70 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c  ( HasRowid(pTabL
26d80 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  ist->a[0].pTab) 
26d90 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
26da0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
26db0 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63 74  .        if( wct
26dc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26dd0 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
26de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
26df0 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41  ordelete = OPFLA
26e00 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20  G_FORDELETE;.   
26e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
26e20 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
26e30 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77  op->wsFlags = (w
26e40 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f  sFlags & ~WHERE_
26e50 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  IDX_ONLY);.     
26e60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
26e70 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
26e80 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
26e90 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
26ea0 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
26eb0 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
26ec0 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
26ed0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  /.  for(ii=0, pL
26ee0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
26ef0 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
26f00 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
26f10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
26f20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
26f30 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
26f40 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
26f50 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
26f60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
26f70 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
26f80 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
26f90 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20  em *pTabItem;.. 
26fa0 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
26fb0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
26fc0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
26fd0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
26fe0 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
26ff0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
27000 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
27010 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
27020 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
27030 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
27040 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
27050 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
27060 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
27070 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
27080 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
27090 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
270a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
270b0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
270c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
270d0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
270e0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
270f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
27100 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
27110 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
27120 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
27130 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
27140 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
27150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27160 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
27170 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
27180 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
27190 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
271a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
271b0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
271c0 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
271d0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
271e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
271f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
27200 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
27210 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
27220 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
27230 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
27240 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
27250 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  nRead;.      if(
27260 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
27270 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s!=ONEPASS_OFF )
27280 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  {.        op = O
27290 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
272a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
272b0 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
272c0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
272d0 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
272e0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
272f0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
27300 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
27310 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
27320 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
27330 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c  tem->iCursor==pL
27340 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b  evel->iTabCur );
27350 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27360 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
27370 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
27380 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
27390 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
273a0 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65  tcase( pWInfo->e
273b0 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
273c0 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43  _OFF && pTab->nC
273d0 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
273e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
273f0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
27400 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
27410 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64  <BMS && HasRowid
27420 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
27430 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
27440 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
27450 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
27460 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
27470 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
27480 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
27490 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
274a0 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e  v, -1, SQLITE_IN
274b0 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
274c0 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
274d0 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
274e0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
274f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
27500 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
27510 54 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  TS.      if( pLo
27520 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
27530 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex!=0 ){.       
27540 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27550 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
27560 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65  EEKEQ|bFordelete
27570 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
27580 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
27590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
275a0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f  eChangeP5(v, bFo
275b0 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  rdelete);.      
275c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
275d0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
275e0 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71  ED_MASK.      sq
275f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
27600 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
27610 73 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d  sUsed, pTabItem-
27620 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a  >iCursor, 0, 0,.
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27640 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
27650 73 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d  st u8*)&pTabItem
27660 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e  ->colUsed, P4_IN
27670 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
27680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
27690 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
276a0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
276b0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
276c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
276d0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
276e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
276f0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49  DEXED ){.      I
27700 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f  ndex *pIx = pLoo
27710 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
27720 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  x;.      int iIn
27730 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e  dexCur;.      in
27740 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
27750 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49 64  ad;.      /* iId
27760 78 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 73  xCur is always s
27770 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74  et if to a posit
27780 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45  ive value if ONE
27790 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65  PASS is possible
277a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
277b0 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c 20  ( iIdxCur!=0 || 
277c0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
277d0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
277e0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
277f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61  );.      if( !Ha
27800 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
27810 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
27820 78 28 70 49 78 29 0a 20 20 20 20 20 20 20 26 26  x(pIx).       &&
27830 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
27840 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
27850 4c 59 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a  LY)!=0.      ){.
27860 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27870 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  is one term of a
27880 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f  n OR-optimizatio
27890 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d  n using the PRIM
278a0 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20  ARY KEY of a.   
278b0 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20       ** WITHOUT 
278c0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f  ROWID table.  No
278d0 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70 61   need for a sepa
278e0 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  rate index */.  
278f0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
27900 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
27910 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  r;.        op = 
27920 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
27930 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
27940 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass!=ONEPASS_OFF
27950 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65   ){.        Inde
27960 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d  x *pJ = pTabItem
27970 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
27980 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
27990 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  r = iIdxCur;.   
279a0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74       assert( wct
279b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
279c0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
279d0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
279e0 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20  ( ALWAYS(pJ) && 
279f0 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20  pJ!=pIx ){.     
27a00 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b       iIndexCur++
27a10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d  ;.          pJ =
27a20 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pJ->pNext;.    
27a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70      }.        op
27a40 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
27a50 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
27a60 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
27a70 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
27a80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49      }else if( iI
27a90 64 78 43 75 72 20 26 26 20 28 77 63 74 72 6c 46  dxCur && (wctrlF
27aa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
27ab0 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29  TABLE_ONLY)!=0 )
27ac0 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
27ad0 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  Cur = iIdxCur;. 
27ae0 20 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c         if( wctrl
27af0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45  Flags & WHERE_RE
27b00 4f 50 45 4e 5f 49 44 58 20 29 20 6f 70 20 3d 20  OPEN_IDX ) op = 
27b10 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20  OP_ReopenIdx;.  
27b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27b30 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
27b40 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
27b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
27b60 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
27b70 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
27b80 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
27b90 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
27ba0 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
27bb0 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d  ert( iIndexCur>=
27bc0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 );.      if( o
27bd0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
27be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
27bf0 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c  , op, iIndexCur,
27c00 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29   pIx->tnum, iDb)
27c10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27c20 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
27c30 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
27c40 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f          if( (pLo
27c50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
27c60 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
27c70 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
27c80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
27c90 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
27ca0 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53  ANGE|WHERE_SKIPS
27cb0 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20  CAN))==0.       
27cc0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
27cd0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
27ce0 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20  RDERBY_MIN)==0. 
27cf0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
27d10 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
27d20 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69  G_SEEKEQ); /* Hi
27d30 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a  nt to COMDB2 */.
27d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27d50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27d60 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
27d70 6d 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  me));.#ifdef SQL
27d80 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
27d90 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
27da0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
27db0 75 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b  u64 colUsed = 0;
27dc0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
27dd0 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20  i, jj;.         
27de0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49   for(ii=0; ii<pI
27df0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b  x->nColumn; ii++
27e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  ){.            j
27e10 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d  j = pIx->aiColum
27e20 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  n[ii];.         
27e30 20 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f     if( jj<0 ) co
27e40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
27e50 20 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20      if( jj>63 ) 
27e60 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20  jj = 63;.       
27e70 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74       if( (pTabIt
27e80 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  em->colUsed & MA
27e90 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20  SKBIT(jj))==0 ) 
27ea0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27eb0 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d        colUsed |=
27ec0 20 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36   ((u64)1)<<(ii<6
27ed0 33 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20  3 ? ii : 63);.  
27ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27f00 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
27f10 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e  ColumnsUsed, iIn
27f20 64 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20  dexCur, 0, 0,.  
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
27f50 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f  8*)&colUsed, P4_
27f60 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20  INT64);.        
27f70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
27f80 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
27f90 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20  _USED_MASK */.  
27fa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27fb0 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c  if( iDb>=0 ) sql
27fc0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
27fd0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
27fe0 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
27ff0 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
28000 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
28010 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
28020 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
28030 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
28040 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
28050 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
28060 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
28070 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
28080 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
28090 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
280a0 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
280b0 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
280c0 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
280d0 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
280e0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
280f0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
28100 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
28110 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i++){.    int ad
28120 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69  drExplain;.    i
28130 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  nt wsFlags;.    
28140 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
28150 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46  ->a[ii];.    wsF
28160 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  lags = pLevel->p
28170 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
28180 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28190 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
281a0 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
281b0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
281c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
281d0 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
281e0 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
281f0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
28200 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
28210 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
28220 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
28230 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
28240 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
28250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
28260 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
28270 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
28280 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
28290 69 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61  if.    addrExpla
282a0 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  in = sqlite3Wher
282b0 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28  eExplainOneScan(
282c0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
282d0 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
282e0 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
282f0 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
28300 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76  .    );.    pLev
28310 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73  el->addrBody = s
28320 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
28330 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f  tAddr(v);.    no
28340 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33  tReady = sqlite3
28350 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70  WhereCodeOneLoop
28360 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69  Start(pWInfo, ii
28370 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
28380 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
28390 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
283a0 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28  rCont;.    if( (
283b0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55  wsFlags&WHERE_MU
283c0 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77  LTI_OR)==0 && (w
283d0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
283e0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d  ONETABLE_ONLY)==
283f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28400 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74  e3WhereAddScanSt
28410 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74  atus(v, pTabList
28420 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78  , pLevel, addrEx
28430 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  plain);.    }.  
28440 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f  }..  /* Done. */
28450 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
28460 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
28470 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20  WHERE-core"));. 
28480 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
28490 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
284a0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
284b0 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72  */.whereBeginErr
284c0 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  or:.  if( pWInfo
284d0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
284e0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
284f0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
28500 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49  Loop;.    whereI
28510 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
28520 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fo);.  }.  retur
28530 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
28540 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
28550 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
28560 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
28570 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
28580 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
28590 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
285a0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
285b0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
285c0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
285d0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
285e0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
285f0 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
28600 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
28610 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
28620 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
28630 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
28640 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  p;.  SrcList *pT
28650 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
28660 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c  >pTabList;.  sql
28670 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
28680 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e  e->db;..  /* Gen
28690 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
286a0 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
286b0 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
286c0 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57  mment((v, "End W
286d0 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
286e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
286f0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
28700 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e   for(i=pWInfo->n
28710 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  Level-1; i>=0; i
28720 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  --){.    int add
28730 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  r;.    pLevel = 
28740 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
28750 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
28760 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73  l->pWLoop;.    s
28770 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
28780 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
28790 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
287a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
287b0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
287c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
287d0 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op3(v, pLevel->o
287e0 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
287f0 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65  Level->p2, pLeve
28800 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71  l->p3);.      sq
28810 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
28820 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29  5(v, pLevel->p5)
28830 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28840 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
28850 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28860 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
28870 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62  Next);.      Vdb
28880 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
28890 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72  Level->op==OP_Pr
288a0 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ev);.      VdbeC
288b0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
288c0 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78  vel->op==OP_VNex
288d0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
288e0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
288f0 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
28900 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
28910 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
28920 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
28930 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
28940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28950 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28960 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
28970 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
28980 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
28990 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
289a0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
289b0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
289c0 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
289d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
289e0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
289f0 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
28a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28a10 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
28a20 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
28a30 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
28a40 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
28a50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
28a60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28a70 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
28a80 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65  Op==OP_PrevIfOpe
28a90 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  n);.        Vdbe
28aa0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
28ab0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
28ac0 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20  P_NextIfOpen);. 
28ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28ae0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
28af0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b  n->addrInTop-1);
28b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28b20 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
28b30 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
28b40 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
28b50 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20  addrSkip ){.    
28b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
28b70 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
28b80 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64  rSkip);.      Vd
28b90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
28ba0 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e  ext skip-scan on
28bb0 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62   %s", pLoop->u.b
28bc0 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
28bd0 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
28be0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
28bf0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
28c00 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  kip);.      sqli
28c10 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
28c20 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
28c30 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69  kip-2);.    }.#i
28c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
28c50 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
28c60 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65  LOBS.    if( pLe
28c70 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
28c80 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
28c90 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
28ca0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
28cb0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
28cc0 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b 0a 20 20  Rep-1)->p1 ){.  
28cd0 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 65        op = OP_De
28ce0 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20 20 20  crJumpZero;.    
28cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28d00 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65 72   op = OP_JumpZer
28d10 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 0a 20  oIncr;.      }. 
28d20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28d30 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4c  AddOp2(v, op, pL
28d40 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
28d50 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  tr, pLevel->addr
28d60 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20  LikeRep);.      
28d70 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
28d80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28d90 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
28da0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
28db0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
28dc0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28dd0 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
28de0 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43  LeftJoin); VdbeC
28df0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
28e00 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
28e10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28e20 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
28e30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
28e40 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
28e50 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
28e60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
28e70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
28e80 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
28e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
28ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28eb0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
28ec0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
28ed0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
28ee0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
28ef0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28f00 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
28f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28f20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
28f30 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
28f40 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
28f50 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
28f60 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
28f70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28f80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
28f90 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
28fa0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
28fb0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
28fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
28fd0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
28fe0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
28ff0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
29000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
29010 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
29020 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
29030 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
29040 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
29050 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
29080 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
29090 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
290a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
290b0 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
290c0 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
290d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
290e0 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
290f0 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
29100 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29110 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
29120 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
29130 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
29140 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
29150 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
29160 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
29170 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
29180 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
29190 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
291a0 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
291b0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
291c0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
291d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
291e0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
291f0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
29200 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
29210 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
29220 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
29230 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
29240 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
29250 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
29260 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
29270 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
29280 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
29290 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
292a0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
292b0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
292c0 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
292d0 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
292e0 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
292f0 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
29300 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
29310 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
29320 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
29330 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
29340 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
29350 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74 72  iled ){.      tr
29360 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43  anslateColumnToC
29370 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  opy(v, pLevel->a
29380 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d  ddrBody, pLevel-
29390 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293b0 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
293c0 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  regResult, 0);. 
293d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
293e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f     }..    /* Clo
293f0 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75  se all of the cu
29400 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20  rsors that were 
29410 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
29420 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 20  3WhereBegin..   
29430 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e   ** Except, do n
29440 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  ot close cursors
29450 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
29460 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20 6f  used by the OR o
29470 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
29480 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  ** (WHERE_OMIT_O
29490 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e 64  PEN_CLOSE).  And
294a0 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68   do not close th
294b0 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63  e OP_OpenWrite c
294c0 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72  ursors.    ** cr
294d0 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e  eated for the ON
294e0 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69  EPASS optimizati
294f0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
29500 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
29510 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
29520 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
29530 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
29540 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
29550 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
29560 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
29570 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  SE)==0.    ){.  
29580 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f      int ws = pLo
29590 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
295a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
295b0 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
295c0 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20 57 48  _OFF && (ws & WH
295d0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
295e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
295f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
29600 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
29610 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
29620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29630 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
29640 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
29650 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f  && (ws & (WHERE_
29660 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  IPK|WHERE_AUTO_I
29670 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20  NDEX))==0 .     
29680 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64    && pLevel->iId
29690 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69  xCur!=pWInfo->ai
296a0 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20  CurOnePass[1].  
296b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
296c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
296d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
296e0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
296f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
29700 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
29710 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
29720 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65  , make VDBE code
29730 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
29740 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
29750 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
29760 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f  x instead of fro
29770 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72  m the table wher
29780 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20  e possible.  In 
29790 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a  some cases.    *
297a0 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * this optimizat
297b0 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65  ion prevents the
297c0 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72   table from ever
297d0 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69   being read, whi
297e0 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69  ch can.    ** yi
297f0 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e  eld a significan
29800 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  t performance bo
29810 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ost..    ** .   
29820 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
29830 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
29840 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
29850 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
29860 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
29870 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
29880 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
29890 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
298a0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
298b0 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
298c0 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
298d0 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
298e0 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
298f0 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
29900 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
29910 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
29920 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
29930 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
29940 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
29950 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
29960 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
29970 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
29980 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
29990 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
299a0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
299b0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
299c0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
299d0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
299e0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
299f0 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
29a00 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dx;.    }.    if
29a10 28 20 70 49 64 78 0a 20 20 20 20 20 26 26 20 28  ( pIdx.     && (
29a20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
29a30 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c  ==ONEPASS_OFF ||
29a40 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d   !HasRowid(pIdx-
29a50 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26  >pTable)).     &
29a60 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
29a70 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  led.    ){.     
29a80 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
29a90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
29aa0 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65  );.      k = pLe
29ab0 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20  vel->addrBody;. 
29ac0 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
29ad0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b  e3VdbeGetOp(v, k
29ae0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b  );.      for(; k
29af0 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
29b00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
29b10 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
29b20 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
29b30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
29b40 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
29b50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
29b60 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70       int x = pOp
29b70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
29b80 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54  assert( pIdx->pT
29b90 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
29ba0 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
29bb0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
29bc0 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
29bd0 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
29be0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
29bf0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
29c00 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c    x = pPk->aiCol
29c10 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20  umn[x];.        
29c20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
29c30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
29c40 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71            x = sq
29c50 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
29c60 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20  ex(pIdx, x);.   
29c70 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20         if( x>=0 
29c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
29c90 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20  Op->p2 = x;.    
29ca0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
29cb0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
29cc0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
29cd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29ce0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
29cf0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
29d00 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b  Y)==0 || x>=0 );
29d10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
29d20 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
29d30 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
29d40 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
29d50 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
29d60 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
29d70 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52  opcode = OP_IdxR
29d80 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
29d90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29da0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c  }..  /* Final cl
29db0 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61  eanup.  */.  pPa
29dc0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
29dd0 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
29de0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65  QueryLoop;.  whe
29df0 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
29e00 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
29e10 3b 0a 7d 0a                                      ;.}.