/ Hex Artifact Content
Login

Artifact af9bf5dcec1a0e52726c550924aa91d837166251:


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 70  NOMEM ){.      p
84b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
84c0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
84d0: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
84e0: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
84f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8500: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8510: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8520: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8540: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8550: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8560: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8570: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8580: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8590: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
85a0: 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
85b0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
85c0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
85d0: 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
85e0: 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
85f0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
8600: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
8610: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8620: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8630: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
8640: 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
8650: 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
8660: 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
8670: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
8680: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8690: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
86a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
86b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
86c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
86d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
86e0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
86f0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
8700: 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  mate the locatio
8710: 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  n of a particula
8720: 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20  r key among all 
8730: 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  keys in an.** in
8740: 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20  dex.  Store the 
8750: 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74  results in aStat
8760: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
8770: 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20  **    aStat[0]  
8780: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
8790: 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61  of rows less tha
87a0: 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74  n pRec.**    aSt
87b0: 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20  at[1]      Est. 
87c0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
87d0: 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a  qual to pRec.**.
87e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
87f0: 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c  dex of the sampl
8800: 65 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d  e that is the sm
8810: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68  allest sample th
8820: 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  at.** is greater
8830: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
8840: 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61  o pRec. Note tha
8850: 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  t this index is 
8860: 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  not an index.** 
8870: 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65  into the aSample
8880: 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73  [] array - it is
8890: 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61   an index into a
88a0: 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20   virtual set of 
88b0: 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64  samples.** based
88c0: 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
88d0: 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e   of aSample[] an
88e0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
88f0: 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64  fields in record
8900: 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73   .** pRec. .*/.s
8910: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b  tatic int whereK
8920: 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
8930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8940: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8950: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
8960: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8980: 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
8990: 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
89a0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
89b0: 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f  d *pRec,       /
89c0: 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75  * Vector of valu
89d0: 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  es to consider *
89e0: 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74  /* Round up if t
8a10: 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e  rue.  Round down
8a20: 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74   if false */.  t
8a30: 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20  Rowcnt *aStat   
8a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8a50: 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e  T: stats written
8a60: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
8a70: 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
8a80: 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
8a90: 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  le;.  int iCol; 
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ab0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65    /* Index of re
8ac0: 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20  quired stats in 
8ad0: 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20  anEq[] etc. */. 
8ae0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b00: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73  Index of first s
8b10: 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f  ample >= pRec */
8b20: 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20  .  int iSample; 
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b40: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
8b50: 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  e larger than or
8b60: 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
8b70: 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
8b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b90: 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
8ba0: 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
8bb0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74  d */.  int iTest
8bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8bd0: 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c     /* Next sampl
8be0: 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69  e to test */.  i
8bf0: 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
8c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8c10: 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
8c20: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
8c30: 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20    int nField;   
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   Number of field
8c60: 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74  s in pRec */.  t
8c70: 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20  Rowcnt iLower = 
8c80: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e  0;         /* an
8c90: 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66  Lt[] + anEq[] of
8ca0: 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20   largest sample 
8cb0: 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69  pRec is > */..#i
8cc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
8cd0: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
8ce0: 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b  METER( pParse );
8cf0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
8d00: 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61  ( pRec!=0 );.  a
8d10: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61  ssert( pIdx->nSa
8d20: 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
8d30: 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  rt( pRec->nField
8d40: 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65  >0 && pRec->nFie
8d50: 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ld<=pIdx->nSampl
8d60: 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  eCol );..  /* Do
8d70: 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68   a binary search
8d80: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72   to find the fir
8d90: 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65  st sample greate
8da0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  r than or equal.
8db0: 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66    ** to pRec. If
8dc0: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61   pRec contains a
8dd0: 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74   single field, t
8de0: 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  he set of sample
8df0: 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a  s to search.  **
8e00: 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61   is simply the a
8e10: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
8e20: 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69  If the samples i
8e30: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74  n aSample[] cont
8e40: 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68  ain more.  ** th
8e50: 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61  an one fields, a
8e60: 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77  ll fields follow
8e70: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72  ing the first ar
8e80: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a  e ignored..  **.
8e90: 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e    ** If pRec con
8ea0: 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20  tains N fields, 
8eb0: 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20  where N is more 
8ec0: 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61  than one, then a
8ed0: 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20  s well as the.  
8ee0: 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  ** samples in aS
8ef0: 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74  ample[] (truncat
8f00: 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c  ed to N fields),
8f10: 20 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f   the search also
8f20: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e   has to.  ** con
8f30: 73 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f  sider prefixes o
8f40: 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e  f those samples.
8f50: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
8f60: 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70   the set of samp
8f70: 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d  les.  ** in aSam
8f80: 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ple is:.  **.  *
8f90: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d  *     aSample[0]
8fa0: 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20   = (a, 5) .  ** 
8fb0: 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d      aSample[1] =
8fc0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
8fd0: 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20     aSample[2] = 
8fe0: 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (b, 5) .  **    
8ff0: 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63   aSample[3] = (c
9000: 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20  , 100) .  **    
9010: 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63   aSample[4] = (c
9020: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
9030: 20 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68   Then the search
9040: 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64   space should id
9050: 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d  eally be the sam
9060: 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74  ples above and t
9070: 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20  he .  ** unique 
9080: 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62  prefixes [a], [b
9090: 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73  ] and [c]. But s
90a0: 69 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72  ince that is har
90b0: 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a  d to organize, .
90c0: 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63    ** the code ac
90d0: 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20  tually searches 
90e0: 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20  this set:.  **. 
90f0: 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a   **     0: (a) .
9100: 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20    **     1: (a, 
9110: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20  5) .  **     2: 
9120: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
9130: 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20    3: (a, 10) .  
9140: 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20  **     4: (b) . 
9150: 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35   **     5: (b, 5
9160: 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28  ) .  **     6: (
9170: 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20  c) .  **     7: 
9180: 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20  (c, 100) .  **  
9190: 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20     8: (c, 105). 
91a0: 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31   **     9: (c, 1
91b0: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  05).  **.  ** Fo
91c0: 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e  r each sample in
91d0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
91e0: 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20  rray, N samples 
91f0: 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  are present in t
9200: 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  he.  ** effectiv
9210: 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20  e sample array. 
9220: 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61  In the above, sa
9230: 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72  mples 0 and 1 ar
9240: 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a  e based on .  **
9250: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
9260: 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e  0]. Samples 2 an
9270: 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31  d 3 on aSample[1
9280: 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ] etc..  **.  **
9290: 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69   Often, sample i
92a0: 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f   of each block o
92b0: 66 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61  f N effective sa
92c0: 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20  mples has (i+1) 
92d0: 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63  fields..  ** Exc
92e0: 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65  ept, each sample
92f0: 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64   may be extended
9300: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
9310: 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
9320: 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c  an or.  ** equal
9330: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
9340: 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61   sample in the a
9350: 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rray. For exampl
9360: 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c  e, in the above,
9370: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20   .  ** sample 2 
9380: 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
9390: 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f  ple of a block o
93a0: 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20  f N samples, so 
93b0: 61 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a  at first it .  *
93c0: 2a 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  * appears that i
93d0: 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69  t should be 1 fi
93e0: 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77  eld in size. How
93f0: 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64  ever, that would
9400: 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73   make it .  ** s
9410: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70  maller than samp
9420: 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e  le 1, so the bin
9430: 61 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64  ary search would
9440: 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20   not work. As a 
9450: 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74  result, .  ** it
9460: 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20   is extended to 
9470: 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20  two fields. The 
9480: 64 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20  duplicates that 
9490: 74 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20  this creates do 
94a0: 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20  not .  ** cause 
94b0: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
94c0: 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52  */.  nField = pR
94d0: 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43  ec->nField;.  iC
94e0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c  ol = 0;.  iSampl
94f0: 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  e = pIdx->nSampl
9500: 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f  e * nField;.  do
9510: 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b  {.    int iSamp;
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
9540: 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73  aSample[] of tes
9550: 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20  t sample */.    
9560: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9580: 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   Number of field
9590: 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65  s in test sample
95a0: 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d   */..    iTest =
95b0: 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f   (iMin+iSample)/
95c0: 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69  2;.    iSamp = i
95d0: 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20  Test / nField;. 
95e0: 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29     if( iSamp>0 )
95f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  {.      /* The p
9600: 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76  roposed effectiv
9610: 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72  e sample is a pr
9620: 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61  efix of sample a
9630: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20  Sample[iSamp].. 
9640: 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63       ** Specific
9650: 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65  ally, the shorte
9660: 73 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20  st prefix of at 
9670: 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74  least (1 + iTest
9680: 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20  %nField) .      
9690: 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69  ** fields that i
96a0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
96b0: 68 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65  he previous effe
96c0: 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a  ctive sample.  *
96d0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69  /.      for(n=(i
96e0: 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b  Test % nField) +
96f0: 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b   1; n<nField; n+
9700: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9710: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d  aSample[iSamp-1]
9720: 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d  .anLt[n-1]!=aSam
9730: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9740: 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n-1] ) break;.  
9750: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
9760: 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74  .      n = iTest
9770: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   + 1;.    }..   
9780: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
9790: 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  n;.    res = sql
97a0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
97b0: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53  mpare(aSample[iS
97c0: 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  amp].n, aSample[
97d0: 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b  iSamp].p, pRec);
97e0: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
97f0: 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
9800: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9810: 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d  anLt[n-1] + aSam
9820: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b  ple[iSamp].anEq[
9830: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9840: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9850: 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30  }else if( res==0
9860: 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a   && n<nField ){.
9870: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
9880: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9890: 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Lt[n-1];.      i
98a0: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
98b0: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20       res = -1;. 
98c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
98d0: 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b  iSample = iTest;
98e0: 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d  .      iCol = n-
98f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  1;.    }.  }whil
9900: 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
9910: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20  Sample );.  i = 
9920: 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64  iSample / nField
9930: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
9940: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
9950: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
9960: 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
9970: 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
9980: 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
9990: 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
99a0: 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
99b0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
99c0: 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
99d0: 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
99e0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
99f0: 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  rts.  */.  if( p
9a00: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9a10: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
9a20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
9a30: 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73        /* If (res
9a40: 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68  ==0) is true, th
9a50: 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  en pRec must be 
9a60: 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20  equal to sample 
9a70: 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  i. */.      asse
9a80: 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
9a90: 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ple );.      ass
9aa0: 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c  ert( iCol==nFiel
9ab0: 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65  d-1 );.      pRe
9ac0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
9ad0: 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ld;.      assert
9ae0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  ( 0==sqlite3Vdbe
9af0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
9b00: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
9b10: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20  ple[i].p, pRec) 
9b20: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
9b30: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9b40: 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29  cFailed .      )
9b50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9b60: 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d     /* Unless i==
9b70: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69  pIdx->nSample, i
9b80: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70  ndicating that p
9b90: 52 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68  Rec is larger th
9ba0: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  an.      ** all 
9bb0: 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61  samples in the a
9bc0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20  Sample[] array, 
9bd0: 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61  pRec must be sma
9be0: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ller than the.  
9bf0: 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20      ** (iCol+1) 
9c00: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
9c10: 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20  sample i.  */.  
9c20: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70      assert( i<=p
9c30: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20  Idx->nSample && 
9c40: 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52  i>=0 );.      pR
9c50: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f  ec->nField = iCo
9c60: 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l+1;.      asser
9c70: 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i==pIdx->nSam
9c80: 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ple .           
9c90: 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
9ca0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9cb0: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
9cc0: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
9cd0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
9ce0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9cf0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20  Failed );..     
9d00: 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20   /* if i==0 and 
9d10: 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65  iCol==0, then re
9d20: 63 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61  cord pRec is sma
9d30: 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ller than all sa
9d40: 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69  mples.      ** i
9d50: 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
9d60: 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
9d70: 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68  , if (iCol>0) th
9d80: 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20  en pRec must.   
9d90: 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72     ** be greater
9da0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
9db0: 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65  o the (iCol) fie
9dc0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
9dd0: 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20  ple i..      ** 
9de0: 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70  If (i>0), then p
9df0: 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  Rec must also be
9e00: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61   greater than sa
9e10: 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a  mple (i-1).  */.
9e20: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30        if( iCol>0
9e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
9e40: 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b  ->nField = iCol;
9e50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9e60: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9e70: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9e80: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
9e90: 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20  i].p, pRec)<=0. 
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
9eb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9ec0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
9ed0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30   }.      if( i>0
9ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
9ef0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
9f00: 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  d;.        asser
9f10: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  t( sqlite3VdbeRe
9f20: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9f30: 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d  ple[i-1].n, aSam
9f40: 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63  ple[i-1].p, pRec
9f50: 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  )<0.            
9f60: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9f70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9f90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
9fa0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
9fb0: 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  /..  if( res==0 
9fc0: 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  ){.    /* Record
9fd0: 20 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74   pRec is equal t
9fe0: 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20  o sample i */.  
9ff0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
a000: 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20  nField-1 );.    
a010: 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70  aStat[0] = aSamp
a020: 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
a030: 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
a040: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71   aSample[i].anEq
a050: 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b  [iCol];.  }else{
a060: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
a070: 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c  point, the (iCol
a080: 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  +1) field prefix
a090: 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69   of aSample[i] i
a0a0: 73 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  s the first .   
a0b0: 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20   ** sample that 
a0c0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
a0d0: 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d  pRec. Or, if i==
a0e0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68  pIdx->nSample th
a0f0: 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69  en pRec.    ** i
a100: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
a110: 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  l samples in the
a120: 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74   array. */.    t
a130: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69  Rowcnt iUpper, i
a140: 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  Gap;.    if( i>=
a150: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b  pIdx->nSample ){
a160: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
a170: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
a180: 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f  nt(pIdx->aiRowLo
a190: 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65  gEst[0]);.    }e
a1a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65  lse{.      iUppe
a1b0: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  r = aSample[i].a
a1c0: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
a1d0: 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ..    if( iLower
a1e0: 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
a1f0: 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
a200: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
a210: 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
a220: 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
a230: 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
a240: 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
a250: 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
a260: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
a270: 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
a280: 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
a290: 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61  er + iGap;.    a
a2a0: 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e  Stat[1] = pIdx->
a2b0: 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  aAvgEq[iCol];.  
a2c0: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
a2d0: 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  the pRec->nField
a2e0: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
a2f0: 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70  turning.  */.  p
a300: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
a310: 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69  ield;.  return i
a320: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
a330: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
a340: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
a350: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  *.** If it is no
a360: 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73  t NULL, pTerm is
a370: 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f   a term that pro
a380: 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f  vides an upper o
a390: 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  r lower.** bound
a3a0: 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e   on a range scan
a3b0: 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64  . Without consid
a3c0: 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20  ering pTerm, it 
a3d0: 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a  is estimated .**
a3e0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
a3f0: 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72  ill visit nNew r
a400: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
a410: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
a420: 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74  umber.** estimat
a430: 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
a440: 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54   after taking pT
a450: 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  erm into account
a460: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ..**.** If the u
a470: 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73  ser explicitly s
a480: 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c  pecified a likel
a490: 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f  ihood() value fo
a4a0: 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20  r this term,.** 
a4b0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
a4c0: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b  value is the lik
a4d0: 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69  elihood multipli
a4e0: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
a4f0: 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77   of.** input row
a500: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  s. Otherwise, th
a510: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
a520: 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20  mes that an "IS 
a530: 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a  NOT NULL" term.*
a540: 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f  * has a likeliho
a550: 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20  od of 0.50, and 
a560: 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61  any other term a
a570: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
a580: 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  .25..*/.static L
a590: 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65  ogEst whereRange
a5a0: 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d  Adjust(WhereTerm
a5b0: 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20   *pTerm, LogEst 
a5c0: 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20  nNew){.  LogEst 
a5d0: 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69  nRet = nNew;.  i
a5e0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
a5f0: 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
a600: 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
a610: 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e   nRet += pTerm->
a620: 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d  truthProb;.    }
a630: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
a640: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a650: 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
a660: 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20     nRet -= 20;  
a670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
a680: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
a690: 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  4) );.    }.  }.
a6a0: 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
a6b0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
a6c0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
a6d0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74  _STAT4./*.** Ret
a6e0: 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  urn the affinity
a6f0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f   for a single co
a700: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
a710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
a720: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
a730: 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69  umnAffinity(sqli
a740: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
a750: 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  pIdx, int iCol){
a760: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
a770: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
a780: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66  >nColumn );.  if
a790: 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  ( !pIdx->zColAff
a7a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
a7b0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
a7c0: 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30  Str(db, pIdx)==0
a7d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a7e0: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20  _AFF_BLOB;.  }. 
a7f0: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43   return pIdx->zC
a800: 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23  olAff[iCol];.}.#
a810: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
a820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
a830: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
a840: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a850: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
a860: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
a870: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
a880: 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
a890: 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
a8a0: 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
a8b0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
a8c0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
a8d0: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
a8e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
a8f0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
a900: 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
a910: 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
a920: 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
a930: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
a940: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
a950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
a960: 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
a970: 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
a980: 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
a990: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
a9a0: 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
a9b0: 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
a9c0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
a9d0: 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
a9e0: 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
a9f0: 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
aa00: 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
aa10: 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
aa20: 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
aa30: 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
aa40: 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
aa50: 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
aa60: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
aa70: 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
aa80: 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
aa90: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
aaa0: 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
aab0: 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
aac0: 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
aad0: 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
aae0: 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
aaf0: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
ab00: 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
ab10: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
ab20: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
ab30: 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
ab40: 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
ab50: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
ab60: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
ab70: 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
ab80: 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
ab90: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
aba0: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
abb0: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
abc0: 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
abd0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
abe0: 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
abf0: 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
ac00: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
ac10: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
ac20: 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
ac30: 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
ac40: 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
ac50: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
ac60: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
ac70: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
ac80: 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
ac90: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
aca0: 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
acb0: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
acc0: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
acd0: 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
ace0: 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
acf0: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
ad00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
ad10: 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
ad20: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
ad30: 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
ad40: 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
ad50: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
ad60: 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
ad70: 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
ad80: 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
ad90: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
ada0: 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
adb0: 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
adc0: 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
add0: 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
ade0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
adf0: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
ae00: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
ae10: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
ae20: 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
ae30: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
ae40: 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
ae50: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
ae60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ae70: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
ae80: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
ae90: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
aea0: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
aeb0: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
aec0: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
aed0: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
aee0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
aef0: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
af00: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
af10: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
af20: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
af30: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
af40: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
af50: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
af60: 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
af70: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
af80: 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
af90: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
afa0: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
afb0: 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
afc0: 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
afd0: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
afe0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
aff0: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
b000: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
b010: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b020: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b030: 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
b040: 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
b050: 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
b060: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b070: 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71  K;.  u8 aff = sq
b080: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
b090: 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20  Affinity(db, p, 
b0a0: 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  nEq);.  CollSeq 
b0b0: 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c  *pColl;.  .  sql
b0c0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d  ite3_value *p1 =
b0d0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b0e0: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b0f0: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20  from pLower */. 
b100: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b110: 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p2 = 0;         
b120: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b130: 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20  ted from pUpper 
b140: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b150: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20  ue *pVal = 0;   
b160: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b170: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63  tracted from rec
b180: 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20  ord */..  pColl 
b190: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
b1a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b1b0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a  ->azColl[nEq]);.
b1c0: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
b1d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b1e0: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b1f0: 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  pr(pParse, pLowe
b200: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b210: 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20  , aff, &p1);.   
b220: 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d   nLower = 0;.  }
b230: 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26  .  if( pUpper &&
b240: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b250: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b260: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
b270: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70  Expr(pParse, pUp
b280: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
b290: 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20  ht, aff, &p2);. 
b2a0: 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f     nUpper = p2 ?
b2b0: 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b   0 : p->nSample;
b2c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c  .  }..  if( p1 |
b2d0: 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  | p2 ){.    int 
b2e0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66  i;.    int nDiff
b2f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
b300: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b310: 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  i<p->nSample; i+
b320: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
b330: 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d  qlite3Stat4Colum
b340: 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  n(db, p->aSample
b350: 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c  [i].p, p->aSampl
b360: 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56  e[i].n, nEq, &pV
b370: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
b380: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b390: 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p1 ){.        in
b3a0: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
b3b0: 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56  emCompare(p1, pV
b3c0: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
b3d0: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
b3e0: 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20   nLower++;.     
b3f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
b400: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32  =SQLITE_OK && p2
b410: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b420: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
b430: 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c  Compare(p2, pVal
b440: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
b450: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
b460: 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Upper++;.      }
b470: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66  .    }.    nDiff
b480: 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f   = (nUpper - nLo
b490: 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  wer);.    if( nD
b4a0: 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d  iff<=0 ) nDiff =
b4b0: 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   1;..    /* If t
b4c0: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
b4d0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
b4e0: 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c  bound specified,
b4f0: 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
b500: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64   comparisons ind
b510: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20  icate that they 
b520: 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  are close togeth
b530: 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c  er, use the fall
b540: 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68  back.    ** meth
b550: 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20  od (assume that 
b560: 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20  the scan visits 
b570: 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73  1/64 of the rows
b580: 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  ) for estimating
b590: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
b5a0: 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
b5b0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  ed. Otherwise, e
b5c0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
b5d0: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a  er of rows.    *
b5e0: 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68  * using the meth
b5f0: 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  od described in 
b600: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
b610: 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  nt for this func
b620: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
b630: 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70   nDiff!=1 || pUp
b640: 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72  per==0 || pLower
b650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
b660: 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69   nAdjust = (sqli
b670: 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61  te3LogEst(p->nSa
b680: 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c  mple) - sqlite3L
b690: 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20  ogEst(nDiff));. 
b6a0: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
b6b0: 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20   -= nAdjust;.   
b6c0: 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a     *pbDone = 1;.
b6d0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
b6e0: 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73  (0x10, ("range s
b6f0: 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73  kip-scan regions
b700: 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74  : %u..%u  adjust
b710: 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 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 20 6e 4c 6f 77 65 72            nLower
b740: 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73  , nUpper, nAdjus
b750: 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  t*-1, pLoop->nOu
b760: 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  t));.    }..  }e
b770: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
b780: 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20   *pbDone==0 );. 
b790: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
b7a0: 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71  ueFree(p1);.  sq
b7b0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
b7c0: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  2);.  sqlite3Val
b7d0: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
b7e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
b7f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
b800: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
b810: 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
b820: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b830: 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
b840: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b850: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
b860: 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
b870: 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
b880: 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
b890: 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
b8a0: 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
b8b0: 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
b8c0: 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
b8d0: 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
b8e0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
b8f0: 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
b900: 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
b910: 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
b920: 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
b930: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
b940: 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
b950: 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
b960: 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
b970: 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
b980: 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
b990: 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
b9a0: 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
b9c0: 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
b9d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b9e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
b9f0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
ba10: 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
ba20: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
ba30: 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
ba40: 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
ba50: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
ba60: 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
ba70: 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
ba80: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
ba90: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
baa0: 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
bab0: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
bac0: 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
bad0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
bae0: 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73  ndex.** column s
baf0: 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61  ubject to the ra
bb00: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
bb10: 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
bb20: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  , the number of.
bb30: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
bb40: 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65  traints optimize
bb50: 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
bb60: 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
bb70: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73  r example,.** as
bb80: 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69  suming index p i
bb90: 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  s on t1(a, b), a
bba0: 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
bbb0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
bbc0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
bbd0: 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
bbe0: 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
bbf0: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
bc00: 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20  et to 1 (as the 
bc10: 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64  range restricted
bc20: 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74   column, b, is t
bc30: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65  he second .** le
bc40: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
bc50: 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
bc60: 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
bc70: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
bc80: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
bc90: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
bca0: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
bcb0: 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a  is set to 0..**.
bcc0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
bcd0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
bce0: 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74   *pnOut is set t
bcf0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67  o the sqlite3Log
bd00: 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20  Est() of the.** 
bd10: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
bd20: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63  hat the index sc
bd30: 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74  an is expected t
bd40: 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20  o visit without 
bd50: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  .** considering 
bd60: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
bd70: 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73  aints. If nEq is
bd80: 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20   0, then *pnOut 
bd90: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
bda0: 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65   .** rows in the
bdb0: 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67   index. Assuming
bdc0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
bdd0: 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75  , *pnOut is adju
bde0: 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a  sted (reduced).*
bdf0: 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  * to account for
be00: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
be10: 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e  raints pLower an
be20: 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a  d pUpper..** .**
be30: 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
be40: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  of sqlite_stat4 
be50: 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72  ANALYZE data, or
be60: 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61   if such data ca
be70: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
be80: 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20   a single range 
be90: 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63  inequality reduc
bea0: 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
beb0: 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
bec0: 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20  of 4. .** and a 
bed0: 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  pair of constrai
bee0: 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  nts (x>? AND x<?
bef0: 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78  ) reduces the ex
bf00: 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
bf10: 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64  .** rows visited
bf20: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
bf30: 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  64..*/.static in
bf40: 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
bf50: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
bf60: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
bf70: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
bf80: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
bf90: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
bfa0: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
bfb0: 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ,.  WhereTerm *p
bfc0: 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
bfd0: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
bfe0: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
bff0: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c000: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c010: 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
c020: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
c030: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
c040: 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
c050: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
c060: 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f  *pLoop     /* Mo
c070: 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61  dify the .nOut a
c080: 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66  nd maybe .rRun f
c090: 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ields */.){.  in
c0a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c0b0: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70  ;.  int nOut = p
c0c0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f  Loop->nOut;.  Lo
c0d0: 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  gEst nNew;..#ifd
c0e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c0f0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
c100: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
c110: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
c120: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
c130: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c140: 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  Eq;..  if( p->nS
c150: 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70  ample>0 && nEq<p
c160: 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a  ->nSampleCol ){.
c170: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75      if( nEq==pBu
c180: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c190: 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b   ){.      Unpack
c1a0: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
c1b0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
c1c0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61  .      tRowcnt a
c1d0: 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66  [2];.      u8 af
c1e0: 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72  f;..      /* Var
c1f0: 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c  iable iLower wil
c200: 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  l be set to the 
c210: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
c220: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
c230: 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  n .      ** the 
c240: 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c  index that are l
c250: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
c260: 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
c270: 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65  range query. The
c280: 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20  .      ** lower 
c290: 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20  bound being the 
c2a0: 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
c2b0: 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72   $P and $L, wher
c2c0: 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20  e $P is the.    
c2d0: 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
c2e0: 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
c2f0: 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
c300: 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
c310: 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20   left-most.     
c320: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74   ** columns of t
c330: 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c  he index, and $L
c340: 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e   is the value in
c350: 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a   pLower..      *
c360: 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69  *.      ** Or, i
c370: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
c380: 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65   or $L cannot be
c390: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c3a0: 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20  it (because it. 
c3b0: 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
c3c0: 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65   simple variable
c3d0: 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75   or literal valu
c3e0: 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  e), the lower bo
c3f0: 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20  und of the.     
c400: 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e   ** range is $P.
c410: 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20   Due to a quirk 
c420: 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72 65  in the way where
c430: 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73  KeyStats() works
c440: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , even.      ** 
c450: 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62  if $L is availab
c460: 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74  le, whereKeyStat
c470: 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  s() is called fo
c480: 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20  r both ($P) and 
c490: 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c  .      ** ($P:$L
c4a0: 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72  ) and the larger
c4b0: 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75   of the two retu
c4c0: 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20 75  rned values is u
c4d0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sed..      **.  
c4e0: 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79      ** Similarly
c4f0: 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62  , iUpper is to b
c500: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c510: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c520: 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
c530: 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74    ** less than t
c540: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  he upper bound o
c550: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
c560: 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70  y. Where the upp
c570: 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a  er bound.      *
c580: 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50 29  * is either ($P)
c590: 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61   or ($P:$U). Aga
c5a0: 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69  in, even if $U i
c5b0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74  s available, bot
c5c0: 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  h values.      *
c5d0: 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65 20  * of iUpper are 
c5e0: 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68 65  requested of whe
c5f0: 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64  reKeyStats() and
c600: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65   the smaller use
c610: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
c620: 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    ** The number 
c630: 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20  of rows between 
c640: 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69  the two bounds i
c650: 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70  s then just iUpp
c660: 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20  er-iLower..     
c670: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
c680: 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a  t iLower;     /*
c690: 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
c6a0: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c6b0: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
c6c0: 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20   iUpper;     /* 
c6d0: 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74  Rows less than t
c6e0: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a  he upper bound *
c6f0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72  /.      int iLwr
c700: 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61  Idx = -2;   /* a
c710: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65  Sample[] for the
c720: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
c730: 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49 64        int iUprId
c740: 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61  x = -1;   /* aSa
c750: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75  mple[] for the u
c760: 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20  pper bound */.. 
c770: 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29 7b       if( pRec ){
c780: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c790: 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21  e( pRec->nField!
c7a0: 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
c7b0: 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  alid );.        
c7c0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  pRec->nField = p
c7d0: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
c7e0: 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  id;.      }.    
c7f0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49    aff = sqlite3I
c800: 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ndexColumnAffini
c810: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
c820: 2c 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73  , nEq);.      as
c830: 73 65 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b  sert( nEq!=p->nK
c840: 65 79 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51  eyCol || aff==SQ
c850: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c860: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74   );.      /* Det
c870: 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e  ermine iLower an
c880: 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28  d iUpper using (
c890: 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  $P) only. */.   
c8a0: 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b     if( nEq==0 ){
c8b0: 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20  .        iLower 
c8c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70  = 0;.        iUp
c8d0: 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74  per = p->nRowEst
c8e0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
c8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a          /* Note:
c900: 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64   this call could
c910: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77   be optimized aw
c920: 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73  ay - since the s
c930: 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ame values must 
c940: 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65  .        ** have
c950: 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20   been requested 
c960: 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79  when testing key
c970: 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61   $P in whereEqua
c980: 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a  lScanEst().  */.
c990: 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79          whereKey
c9a0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
c9b0: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
c9c0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
c9d0: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70  [0];.        iUp
c9e0: 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31  per = a[0] + a[1
c9f0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  ];.      }..    
ca00: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
ca10: 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e  ==0 || (pLower->
ca20: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
ca30: 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b  GT|WO_GE))!=0 );
ca40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ca50: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
ca60: 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
ca70: 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21   (WO_LT|WO_LE))!
ca80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
ca90: 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65  rt( p->aSortOrde
caa0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  r!=0 );.      if
cab0: 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  ( p->aSortOrder[
cac0: 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  nEq] ){.        
cad0: 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20  /* The roles of 
cae0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
caf0: 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f  r are swapped fo
cb00: 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a  r a DESC index *
cb10: 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57  /.        SWAP(W
cb20: 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65  hereTerm*, pLowe
cb30: 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20  r, pUpper);.    
cb40: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
cb50: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
cb60: 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
cb70: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
cb80: 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
cb90: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
cba0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b          int bOk;
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
cbd0: 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
cbe0: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
cbf0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
cc00: 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
cc10: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
cc20: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cc30: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
cc40: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
cc50: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
cc60: 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
cc70: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
cc80: 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29  LITE_OK && bOk )
cc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
cca0: 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
ccb0: 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68      iLwrIdx = wh
ccc0: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
ccd0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
cce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  a);.          iN
ccf0: 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c  ew = a[0] + ((pL
cd00: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
cd10: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29  & (WO_GT|WO_LE))
cd20: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
cd30: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
cd40: 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72  >iLower ) iLower
cd50: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
cd60: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
cd70: 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b       pLower = 0;
cd80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cd90: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
cda0: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
cdb0: 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
cdc0: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
cdd0: 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$U). */.     
cde0: 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
cdf0: 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20         int bOk; 
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61     /* True if va
ce20: 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64  lue is extracted
ce30: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
ce40: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
ce50: 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
ce60: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
ce70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ce80: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
ce90: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
cea0: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
ceb0: 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
cec0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
ced0: 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
cee0: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
cef0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
cf00: 20 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65     iUprIdx = whe
cf10: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
cf20: 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
cf30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
cf40: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70  w = a[0] + ((pUp
cf50: 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
cf60: 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20   (WO_GT|WO_LE)) 
cf70: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
cf80: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c         if( iNew<
cf90: 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20  iUpper ) iUpper 
cfa0: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
cfb0: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
cfc0: 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a      pUpper = 0;.
cfd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cfe0: 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65  }..      pBuilde
cff0: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
d000: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
d010: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d020: 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
d030: 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
d040: 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
d050: 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20  LogEst(iUpper - 
d060: 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20  iLower);.       
d070: 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49     /* TUNING:  I
d080: 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e  f both iUpper an
d090: 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72  d iLower are der
d0a0: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61  ived from the sa
d0b0: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
d0c0: 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73  sample, then ass
d0d0: 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20  ume they are 4x 
d0e0: 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20  more selective. 
d0f0: 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20   This brings.   
d100: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73         ** the es
d110: 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76  timated selectiv
d120: 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65  ity more in line
d130: 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f   with what it wo
d140: 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20  uld be.         
d150: 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64   ** if estimated
d160: 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65   without the use
d170: 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c   of STAT3/4 tabl
d180: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
d190: 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55   if( iLwrIdx==iU
d1a0: 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20  prIdx ) nNew -= 
d1b0: 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d  20;  assert( 20=
d1c0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
d1d0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ) );.        }el
d1e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e  se{.          nN
d1f0: 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
d200: 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
d210: 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
d220: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d230: 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
d240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
d250: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
d260: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
d270: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53  ETRACE(0x10, ("S
d280: 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a  TAT4 range scan:
d290: 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
d2a0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d2c0: 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
d2d0: 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
d2e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d2f0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
d300: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  one = 0;.      r
d310: 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b  c = whereRangeSk
d320: 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  ipScanEst(pParse
d330: 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
d340: 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29  , pLoop, &bDone)
d350: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e  ;.      if( bDon
d360: 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  e ) return rc;. 
d370: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
d380: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d390: 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
d3a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
d3b0: 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72  uilder);.  asser
d3c0: 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
d3d0: 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  per );.#endif.  
d3e0: 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
d3f0: 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74  0 || (pUpper->wt
d400: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
d410: 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77  LL)==0 );.  nNew
d420: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
d430: 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74  ust(pLower, nOut
d440: 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
d450: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70  eRangeAdjust(pUp
d460: 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f  per, nNew);..  /
d470: 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
d480: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
d490: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69  per and lower li
d4a0: 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20  mit and neither 
d4b0: 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61  limit.  ** has a
d4c0: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65  n application-de
d4d0: 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64  fined likelihood
d4e0: 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72  (), assume the r
d4f0: 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64  ange is.  ** red
d500: 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74  uced by an addit
d510: 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20  ional 75%. This 
d520: 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64  means that, by d
d530: 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d  efault, an open-
d540: 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65  ended.  ** range
d550: 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c   query (e.g. col
d560: 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64   > ?) is assumed
d570: 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66   to match 1/4 of
d580: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
d590: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69  .  ** index. Whi
d5a0: 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67  le a closed rang
d5b0: 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57  e (e.g. col BETW
d5c0: 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20  EEN ? AND ?) is 
d5d0: 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a  estimated to.  *
d5e0: 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20  * match 1/64 of 
d5f0: 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20  the index. */ . 
d600: 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70   if( pLower && p
d610: 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Lower->truthProb
d620: 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20  >0 && pUpper && 
d630: 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f  pUpper->truthPro
d640: 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  b>0 ){.    nNew 
d650: 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f  -= 20;.  }..  nO
d660: 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30  ut -= (pLower!=0
d670: 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b  ) + (pUpper!=0);
d680: 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29  .  if( nNew<10 )
d690: 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66   nNew = 10;.  if
d6a0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f  ( nNew<nOut ) nO
d6b0: 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64  ut = nNew;.#if d
d6c0: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
d6d0: 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
d6e0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75   pLoop->nOut>nOu
d6f0: 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  t ){.    WHERETR
d700: 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65  ACE(0x10,("Range
d710: 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75   scan lowers nOu
d720: 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  t from %d to %d\
d730: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
d740: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
d750: 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d  Out, nOut));.  }
d760: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d  .#endif.  pLoop-
d770: 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
d780: 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
d790: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
d7a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
d7b0: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
d7c0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
d7d0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
d7e0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
d7f0: 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
d800: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
d810: 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
d820: 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
d830: 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
d840: 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
d850: 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
d860: 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
d870: 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
d880: 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
d890: 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
d8a0: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
d8b0: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
d8c0: 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
d8d0: 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
d8e0: 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
d8f0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
d900: 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
d910: 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
d920: 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
d930: 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
d940: 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
d950: 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
d960: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
d970: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
d980: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
d990: 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
d9a0: 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
d9b0: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
d9c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d9d0: 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
d9e0: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
d9f0: 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
da00: 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
da10: 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
da20: 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
da30: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
da40: 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
da50: 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
da60: 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
da70: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
da80: 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
da90: 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
daa0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
dab0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
dac0: 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
dad0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dae0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
daf0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
db00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
db10: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
db20: 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
db30: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
db40: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
db50: 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
db60: 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
db70: 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
db80: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
db90: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
dba0: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
dbb0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
dbc0: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
dbd0: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
dbe0: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
dbf0: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
dc00: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
dc10: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
dc20: 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
dc30: 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66  r->pRec;.  u8 af
dc40: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
dc50: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
dc60: 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
dc70: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
dc80: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
dc90: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
dca0: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
dcb0: 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
dcc0: 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
dcd0: 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
dce0: 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
dcf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
dd00: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  =p->nColumn );. 
dd10: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
dd20: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
dd30: 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
dd40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
dd50: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
dd60: 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49  d<nEq );..  /* I
dd70: 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  f values are not
dd80: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
dd90: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
dda0: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65   index to the le
ddb0: 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  ft.  ** of this 
ddc0: 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65  one, no estimate
ddd0: 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65   can be made. Re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
ddf0: 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70  OUND. */.  if( p
de00: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
de10: 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20  id<(nEq-1) ){.  
de20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
de30: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20  NOTFOUND;.  }.. 
de40: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   /* This is an o
de50: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
de60: 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  . The call to sq
de70: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
de80: 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62  etValue().  ** b
de90: 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72  elow would retur
dea0: 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  n the same value
deb0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e  .  */.  if( nEq>
dec0: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  =p->nColumn ){. 
ded0: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
dee0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
def0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20  _OK;.  }..  aff 
df00: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f  = sqlite3IndexCo
df10: 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61  lumnAffinity(pPa
df20: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d  rse->db, p, nEq-
df30: 31 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1);.  rc = sqlit
df40: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
df50: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
df60: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
df70: 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  f, nEq-1, &bOk);
df80: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
df90: 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
dfa0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
dfb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
dfc0: 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
dfd0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
dfe0: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
dff0: 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
e000: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
e010: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
e020: 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
e030: 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
e040: 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
e050: 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
e060: 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
e070: 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
e080: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e090: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e0a0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e0b0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
e0c0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e0d0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
e0e0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
e0f0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
e100: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
e110: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
e120: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
e130: 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
e140: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
e150: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
e160: 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
e170: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
e180: 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
e190: 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
e1a0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
e1b0: 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
e1c0: 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
e1d0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e1e0: 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
e1f0: 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
e200: 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
e210: 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
e220: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
e230: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
e240: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
e250: 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
e260: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
e270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
e280: 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
e290: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
e2a0: 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
e2b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
e2c0: 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
e2d0: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
e2e0: 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
e2f0: 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
e300: 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
e310: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
e320: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
e330: 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
e340: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
e350: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
e360: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
e370: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
e380: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
e390: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
e3a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
e3b0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
e3c0: 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
e3d0: 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
e3e0: 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
e3f0: 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
e400: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
e410: 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
e420: 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
e430: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
e440: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
e450: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
e460: 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73  .  i64 nRow0 = s
e470: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
e480: 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  t(p->aiRowLogEst
e490: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63  [0]);.  int nRec
e4a0: 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
e4b0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
e4c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e4d0: 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
e4e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
e4f0: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
e500: 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
e510: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
e520: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
e530: 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
e540: 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
e550: 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
e560: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
e570: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
e580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e590: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e5a0: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
e5b0: 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
e5c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
e5d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e5e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
e5f0: 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e  +){.    nEst = n
e600: 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77  Row0;.    rc = w
e610: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
e620: 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
e630: 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r, pList->a[i].p
e640: 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
e650: 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
e660: 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  t;.    pBuilder-
e670: 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
e680: 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69  cValid;.  }..  i
e690: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e6a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
e6b0: 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52  Est > nRow0 ) nR
e6c0: 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20  owEst = nRow0;. 
e6d0: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
e6e0: 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
e6f0: 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
e700: 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
e710: 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %d\n", nRowEst))
e720: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e730: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e740: 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
e750: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e760: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e770: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e780: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66  R_STAT4 */...#if
e790: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
e7a0: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
e7b0: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
e7c0: 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
e7d0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
e7e0: 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
e7f0: 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
e800: 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
e810: 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
e820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
e830: 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
e840: 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
e850: 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
e860: 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
e870: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
e880: 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
e890: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
e8a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
e8b0: 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20  TUAL ) zType[0] 
e8c0: 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'V';.    if( p
e8d0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e8e0: 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
e8f0: 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
e900: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
e910: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
e920: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
e930: 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
e940: 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ';.    sqlite3De
e950: 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
e960: 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20    "TERM-%-3d %p 
e970: 25 73 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70  %s cursor=%-3d p
e980: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
e990: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
e9a0: 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65  x\n",.       iTe
e9b0: 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65  rm, pTerm, zType
e9c0: 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  , pTerm->leftCur
e9d0: 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74  sor, pTerm->trut
e9e0: 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54  hProb,.       pT
e9f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20  erm->eOperator, 
ea00: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b  pTerm->wtFlags);
ea10: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
ea20: 56 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72  ViewExpr(0, pTer
ea30: 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  m->pExpr, 0);.  
ea40: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
ea50: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
ea60: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
ea70: 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
ea80: 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
ea90: 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
eaa0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
eab0: 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
eac0: 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
ead0: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
eae0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
eaf0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
eb00: 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
eb10: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
eb20: 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
eb30: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
eb40: 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
eb50: 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
eb60: 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
eb70: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
eb80: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
eb90: 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
eba0: 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
ebb0: 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
ebd0: 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
ebe0: 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
ebf0: 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
ec00: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
ec10: 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
ec20: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
ec30: 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
ec40: 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
ec50: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
ec60: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
ec70: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
ec80: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
ec90: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
eca0: 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
ecb0: 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
ecc0: 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
ecd0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
ece0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
ecf0: 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
ed00: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
ed10: 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
ed20: 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
ed30: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
ed40: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
ed50: 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
ed60: 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
ed70: 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
ed80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ed90: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
eda0: 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
edb0: 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
edc0: 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
edd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
ede0: 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
edf0: 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
ee00: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
ee10: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
ee20: 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
ee30: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
ee40: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
ee50: 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
ee60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
ee70: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
ee80: 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
ee90: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
eea0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
eeb0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
eec0: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
eed0: 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
eee0: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
eef0: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
ef00: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
ef10: 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
ef20: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
ef30: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
ef40: 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
ef50: 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
ef60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
ef70: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
ef80: 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
ef90: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
efa0: 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
efb0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
efc0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
efd0: 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
efe0: 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
eff0: 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
f000: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
f010: 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
f020: 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
f030: 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
f040: 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
f050: 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
f060: 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
f070: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
f080: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
f090: 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
f0a0: 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
f0b0: 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
f0c0: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
f0d0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f0e0: 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
f0f0: 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
f100: 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
f110: 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
f120: 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
f130: 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
f140: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f150: 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
f160: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
f170: 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
f180: 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
f190: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
f1a0: 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
f1b0: 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
f1c0: 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
f1d0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
f1e0: 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
f1f0: 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
f200: 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
f210: 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
f220: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
f230: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
f240: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f250: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
f260: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
f270: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
f280: 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
f290: 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
f2a0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f2b0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
f2c0: 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
f2d0: 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
f2e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f2f0: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
f300: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
f310: 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
f320: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f330: 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
f340: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
f350: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
f360: 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
f370: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
f380: 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
f390: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f3a0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
f3b0: 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
f3c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f3d0: 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
f3e0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
f3f0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f400: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f410: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
f420: 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
f430: 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
f440: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
f450: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f460: 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
f470: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f480: 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
f490: 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
f4a0: 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
f4b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
f4c0: 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
f4d0: 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
f4e0: 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
f4f0: 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
f500: 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
f510: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
f520: 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
f530: 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
f540: 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
f550: 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
f560: 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
f570: 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
f580: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
f590: 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
f5a0: 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
f5b0: 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
f5c0: 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
f5d0: 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
f5e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
f5f0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
f600: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
f610: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
f620: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f630: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
f640: 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
f650: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
f660: 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
f670: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
f680: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
f690: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
f6a0: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
f6b0: 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
f6c0: 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
f6d0: 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
f6e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f6f0: 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
f700: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
f710: 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
f720: 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
f730: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
f740: 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
f750: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
f760: 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
f770: 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
f780: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
f790: 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
f7a0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
f7b0: 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
f7c0: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
f7d0: 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
f7e0: 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
f7f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f800: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
f810: 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
f820: 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
f830: 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
f840: 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
f850: 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
f860: 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
f870: 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
f880: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
f890: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
f8a0: 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
f8b0: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
f8c0: 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
f8d0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
f8e0: 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
f8f0: 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
f900: 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
f910: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f920: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
f930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f940: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
f950: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
f960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f970: 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
f980: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f990: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
f9a0: 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
f9b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
f9c0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
f9d0: 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
f9e0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
f9f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
fa00: 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
fa10: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
fa20: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
fa30: 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
fa40: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
fa50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
fa60: 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
fa70: 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
fa80: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
fa90: 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
faa0: 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
fab0: 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76  >pWLoop && (pLev
fac0: 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
fad0: 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
fae0: 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  BLE) ){.        
faf0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
fb00: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
fb10: 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  InLoop);.      }
fb20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fb30: 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65  e3WhereClauseCle
fb40: 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
fb50: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
fb60: 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
fb70: 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
fb80: 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
fb90: 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
fba0: 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
fbb0: 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
fbc0: 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
fbd0: 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
fbe0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fbf0: 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
fc00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fc10: 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20 74  TRUE if all of t
fc20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
fc30: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
fc40: 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73 61  1)  X has the sa
fc50: 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  me or lower cost
fc60: 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32 29   that Y.**   (2)
fc70: 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20    X is a proper 
fc80: 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20  subset of Y.**  
fc90: 20 28 33 29 20 20 58 20 73 6b 69 70 73 20 61 74   (3)  X skips at
fca0: 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
fcb0: 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a  olumns as Y.**.*
fcc0: 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75 62  * By "proper sub
fcd0: 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68 61  set" we mean tha
fce0: 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20 57  t X uses fewer W
fcf0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
fd00: 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64 20  s.** than Y and 
fd10: 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
fd20: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
fd30: 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20 75  d by X is also u
fd40: 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a  sed.** by Y..**.
fd50: 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72 6f  ** If X is a pro
fd60: 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 20  per subset of Y 
fd70: 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74 74  then Y is a bett
fd80: 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f 75  er choice and ou
fd90: 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61  ght.** to have a
fda0: 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54 68   lower cost.  Th
fdb0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
fdc0: 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68 61  ns TRUE when tha
fdd0: 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74  t cost .** relat
fde0: 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65 72  ionship is inver
fdf0: 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  ted and needs to
fe00: 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20 54   be adjusted.  T
fe10: 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a  he third rule.**
fe20: 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61 75   was added becau
fe30: 73 65 20 69 66 20 58 20 75 73 65 73 20 73 6b 69  se if X uses ski
fe40: 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61 6e  p-scan less than
fe50: 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67 68   Y it still migh
fe60: 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20 6c  t.** deserve a l
fe70: 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20 69  ower cost even i
fe80: 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
fe90: 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f   subset of Y..*/
fea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
feb0: 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
fec0: 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73  erSubset(.  cons
fed0: 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c  t WhereLoop *pX,
fee0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
fef0: 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d  WhereLoop to com
ff00: 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pare */.  const 
ff10: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20  WhereLoop *pY   
ff20: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20       /* Compare 
ff30: 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68 65  against this Whe
ff40: 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69  reLoop */.){.  i
ff50: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70  nt i, j;.  if( p
ff60: 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53  X->nLTerm-pX->nS
ff70: 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72  kip >= pY->nLTer
ff80: 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20  m-pY->nSkip ){. 
ff90: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
ffa0: 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65  X is not a subse
ffb0: 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  t of Y */.  }.  
ffc0: 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20  if( pY->nSkip > 
ffd0: 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75  pX->nSkip ) retu
ffe0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e  rn 0;.  if( pX->
fff0: 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e  rRun >= pY->rRun
10000 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   ){.    if( pX->
10010 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20  rRun > pY->rRun 
10020 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
10030 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
10040 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28  han Y */.    if(
10050 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e   pX->nOut > pY->
10060 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nOut ) return 0;
10070 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
10080 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
10090 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c  }.  for(i=pX->nL
100a0 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
100b0 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  -){.    if( pX->
100c0 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63  aLTerm[i]==0 ) c
100d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
100e0 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  (j=pY->nLTerm-1;
100f0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
10100 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72     if( pY->aLTer
10110 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d  m[j]==pX->aLTerm
10120 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [i] ) break;.   
10130 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
10140 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58   return 0;  /* X
10150 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
10160 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b   Y since term X[
10170 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59  i] not used by Y
10180 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
10190 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64   1;  /* All cond
101a0 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d  itions meet */.}
101b0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61  ../*.** Try to a
101c0 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f  djust the cost o
101d0 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d  f WhereLoop pTem
101e0 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f 72  plate upwards or
101f0 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a   downwards so.**
10200 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   that:.**.**   (
10210 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  1) pTemplate cos
10220 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79  ts less than any
10230 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
10240 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72 6f  s that are a pro
10250 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62  per.**       sub
10260 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65  set of pTemplate
10270 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65  .**.**   (2) pTe
10280 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72  mplate costs mor
10290 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  e than any other
102a0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20   WhereLoops for 
102b0 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a  which pTemplate.
102c0 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70 72  **       is a pr
102d0 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a  oper subset..**.
102e0 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72 65  ** To say "Where
102f0 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70  Loop X is a prop
10300 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22 20  er subset of Y" 
10310 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73 65  means that X use
10320 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45  s fewer.** WHERE
10330 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
10340 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76  an Y and that ev
10350 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
10360 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
10370 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20  is.** also used 
10380 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  by Y..*/.static 
10390 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64  void whereLoopAd
103a0 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57  justCost(const W
103b0 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65  hereLoop *p, Whe
103c0 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
103d0 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70  e){.  if( (pTemp
103e0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
103f0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
10400 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
10410 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  r(; p; p=p->pNex
10420 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28 20  tLoop){.    if( 
10430 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
10440 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74 69  te->iTab ) conti
10450 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d  nue;.    if( (p-
10460 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10470 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 63  _INDEXED)==0 ) c
10480 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
10490 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
104a0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c  rProperSubset(p,
104b0 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20   pTemplate) ){. 
104c0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70       /* Adjust p
104d0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f  Template cost do
104e0 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  wnward so that i
104f0 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68 61  t is cheaper tha
10500 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20  n its .      ** 
10510 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20  subset p. */.   
10520 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
10530 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
10540 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
10550 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  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 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10580 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
10590 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
105a0 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20   p->nOut-1));.  
105b0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
105c0 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
105d0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
105e0 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d  nOut = p->nOut -
105f0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
10600 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
10610 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
10620 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a  Template, p) ){.
10630 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
10640 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75  pTemplate cost u
10650 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74  pward so that it
10660 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61   is costlier tha
10670 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20  n p since.      
10680 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  ** pTemplate is 
10690 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
106a0 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57 48  of p */.      WH
106b0 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22  ERETRACE(0x80,("
106c0 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75  subset cost adju
106d0 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20  stment %d,%d to 
106e0 25 64 2c 25 64 5c 6e 22 2c 0a 20 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 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
10710 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  , pTemplate->nOu
10720 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  t, p->rRun, p->n
10730 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 70  Out+1));.      p
10740 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d  Template->rRun =
10750 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20   p->rRun;.      
10760 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
10770 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20  = p->nOut + 1;. 
10780 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
10790 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69 73  * Search the lis
107a0 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  t of WhereLoops 
107b0 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69  in *ppPrev looki
107c0 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20  ng for one that 
107d0 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61  can be.** suppla
107e0 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  nted by pTemplat
107f0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
10800 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65 72  NULL if the Wher
10810 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61  eLoop list conta
10820 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68 61  ins an entry tha
10830 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a  t can supplant.*
10840 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20  * pTemplate, in 
10850 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
10860 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f  Template does no
10870 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20  t belong on the 
10880 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  list..**.** If p
10890 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  X is a WhereLoop
108a0 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20   that pTemplate 
108b0 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74 68  can supplant, th
108c0 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  en return the.**
108d0 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74   link that point
108e0 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49  s to pX..**.** I
108f0 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e  f pTemplate cann
10900 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79 20  ot supplant any 
10910 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74  existing element
10920 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75 74   of the list but
10930 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
10940 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
10950 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  t, then return a
10960 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10970 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74  tail of the list
10980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
10990 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f  eLoop **whereLoo
109a0 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57  pFindLesser(.  W
109b0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
109c0 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  v,.  const Where
109d0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a  Loop *pTemplate.
109e0 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
109f0 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50  p;.  for(p=(*ppP
10a00 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d  rev); p; ppPrev=
10a10 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
10a20 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
10a30 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
10a40 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
10a50 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
10a60 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
10a70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65  ){.      /* If e
10a80 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f  ither the iTab o
10a90 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65  r iSortIdx value
10aa0 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c  s for two WhereL
10ab0 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e  oop are differen
10ac0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  t.      ** then 
10ad0 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73  those WhereLoops
10ae0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
10af0 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c  idered separatel
10b00 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20  y.  Neither is. 
10b10 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64       ** a candid
10b20 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ate to replace t
10b30 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20  he other. */.   
10b40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10b50 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65   }.    /* In the
10b60 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
10b70 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65  ntation, the rSe
10b80 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74  tup value is eit
10b90 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20  her zero.    ** 
10ba0 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62  or the cost of b
10bb0 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
10bc0 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67  atic index (Nlog
10bd0 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e  N) and the NlogN
10be0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
10bf0 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ame for compatib
10c00 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a  le WhereLoops. *
10c10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
10c20 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54  >rSetup==0 || pT
10c30 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d  emplate->rSetup=
10c40 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
10c50 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75       || p->rSetu
10c60 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
10c70 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
10c80 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
10c90 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72  e() always gener
10ca0 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73  ates and inserts
10cb0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
10cc0 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65  ndex.    ** case
10cd0 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63   first.  Hence c
10ce0 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64  ompatible candid
10cf0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ate WhereLoops n
10d00 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67  ever have a larg
10d10 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70  er.    ** rSetup
10d20 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55  . Call this SETU
10d30 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20  P-INVARIANT */. 
10d40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
10d50 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
10d60 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
10d70 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e  /* Any loop usin
10d80 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d  g an appliation-
10d90 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f  defined index (o
10da0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  r PRIMARY KEY or
10db0 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63  .    ** UNIQUE c
10dc0 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68 20  onstraint) with 
10dd0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63  one or more == c
10de0 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62 65  onstraints is be
10df0 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  tter.    ** than
10e00 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
10e10 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  dex. Unless it i
10e20 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a  s a skip-scan. *
10e30 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  /.    if( (p->ws
10e40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
10e50 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20  TO_INDEX)!=0.   
10e60 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
10e70 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20  >nSkip)==0.     
10e80 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
10e90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
10ea0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
10eb0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
10ec0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
10ed0 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20  OLUMN_EQ)!=0.   
10ee0 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20    && (p->prereq 
10ef0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
10f00 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
10f10 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20  >prereq.    ){. 
10f20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10f30 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69  }..    /* If exi
10f40 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
10f50 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  p is better than
10f60 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d   pTemplate, pTem
10f70 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20  plate can be.   
10f80 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20   ** discarded.  
10f90 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
10fa0 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a  etter if:.    **
10fb0 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f     (1)  p has no
10fc0 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69   more dependenci
10fd0 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  es than pTemplat
10fe0 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
10ff0 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71  (2)  p has an eq
11000 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
11010 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  t than pTemplate
11020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11030 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
11040 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
11050 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a  =p->prereq    /*
11060 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
11070 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
11080 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20  plate->rSetup   
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
110a0 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
110b0 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
110c0 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20  /* (2b) */.     
110f0 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
11100 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20   /* (2c) */.    
11130 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11140 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70  0;  /* Discard p
11150 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
11160 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65  }..    /* If pTe
11170 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73  mplate is always
11180 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20   better than p, 
11190 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20  then cause p to 
111a0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
111b0 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70     ** with pTemp
111c0 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65  late.  pTemplate
111d0 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
111e0 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  p if:.    **   (
111f0 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  1)  pTemplate ha
11200 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
11210 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e  ences than p, an
11220 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
11230 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e  pTemplate has an
11240 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
11250 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20  cost than p..   
11260 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
11270 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
11280 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
11290 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20  mplate->prereq  
112a0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
112b0 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65   && p->rRun>=pTe
112c0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->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 2f 2a 20 28 32 61 29           /* (2a)
112f0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
11300 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out>=pTemplate->
11310 6e 4f 75 74 20 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 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
11340 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11350 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
11360 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
11370 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
11380 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
11390 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43     break;   /* C
113a0 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
113b0 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d  rwritten by pTem
113c0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  plate */.    }. 
113d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72   }.  return ppPr
113e0 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ev;.}../*.** Ins
113f0 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
11400 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
11410 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
11420 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
11430 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
11440 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
11450 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
11460 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
11470 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
11480 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
11490 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
114a0 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
114b0 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
114c0 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
114d0 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
114e0 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
114f0 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
11500 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
11510 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
11520 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
11530 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
11540 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
11550 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
11560 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
11570 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
11580 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
11590 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63  t NULL then we c
115a0 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74  are about only t
115b0 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69  he.** prerequisi
115c0 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64  tes and rRun and
115d0 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74   nOut costs of t
115e0 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e  he N best loops.
115f0 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d    That.** inform
11600 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65  ation is gathere
11610 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65  d in the pBuilde
11620 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74  r->pOrSet object
11630 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a  .  This special.
11640 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f  ** processing mo
11650 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  de is used only 
11660 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
11670 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
11680 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
11690 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
116a0 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
116b0 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29  >pOrSet is NULL)
116c0 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
116d0 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
116e0 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
116f0 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
11700 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74   if the.** new t
11710 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
11720 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
11730 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
11740 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
11750 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
11760 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
11770 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
11780 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
11790 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
117a0 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
117b0 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
117c0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
117d0 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
117e0 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
117f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
11800 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
11810 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
11820 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
11830 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
11840 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74  rrent loop.*/.st
11850 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
11860 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f  opInsert(WhereLo
11870 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
11880 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  der, WhereLoop *
11890 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68  pTemplate){.  Wh
118a0 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
118b0 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66  , *p;.  WhereInf
118c0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
118d0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
118e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
118f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
11900 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
11910 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
11920 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
11930 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
11940 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
11950 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
11960 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
11970 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20  >pOrSet!=0 ){.  
11980 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d    if( pTemplate-
11990 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57  >nLTerm ){.#if W
119a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
119b0 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20  D.      u16 n = 
119c0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
119d0 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  ->n;.      int x
119e0 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   =.#endif.      
119f0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42  whereOrInsert(pB
11a00 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20  uilder->pOrSet, 
11a10 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11a20 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  q, pTemplate->rR
11a30 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  un,.            
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 70 54 65 6d 70 6c 61 74          pTemplat
11a60 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48  e->nOut);.#if WH
11a70 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
11a80 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
11a90 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
11aa0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
11ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11ac0 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
11ad0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
11ae0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
11af0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
11b00 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
11b10 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11b20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
11b30 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
11b40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
11b50 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20   /* Look for an 
11b60 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11b70 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69  op to replace wi
11b80 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a  th pTemplate.  *
11b90 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  /.  whereLoopAdj
11ba0 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e  ustCost(pWInfo->
11bb0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
11bc0 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77  e);.  ppPrev = w
11bd0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
11be0 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  er(&pWInfo->pLoo
11bf0 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
11c00 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30  .  if( ppPrev==0
11c10 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
11c20 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11c30 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74  a WhereLoop on t
11c40 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
11c50 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
11c60 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f  an pTemplate, so
11c70 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65   just ignore pTe
11c80 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48  mplate */.#if WH
11c90 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
11ca0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
11cb0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
11cc0 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
11cd0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
11ce0 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a  Printf("   skip:
11cf0 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
11d00 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
11d10 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
11d20 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
11d30 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
11d40 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
11d50 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
11d60 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
11d70 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
11d80 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
11d90 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
11da0 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
11db0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
11dc0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
11dd0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
11de0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
11df0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
11e00 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
11e10 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
11e20 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
11e30 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
11e40 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
11e50 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
11e60 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
11e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
11e80 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63  ugPrintf("replac
11e90 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  e: ");.      whe
11ea0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
11eb0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11ec0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11ed0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
11ee0 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77 68   add: ");.    wh
11ef0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
11f00 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
11f10 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->pWC);.  }.#end
11f20 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  if.  if( p==0 ){
11f30 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
11f40 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
11f50 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65   to add to the e
11f60 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a  nd of the list *
11f70 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20  /.    *ppPrev = 
11f80 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
11f90 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
11fa0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
11fb0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
11fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11fd0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
11fe0 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  Init(p);.    p->
11ff0 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20  pNextLoop = 0;. 
12000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
12010 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  e will be overwr
12020 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  iting WhereLoop 
12030 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65  p[].  But before
12040 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20   we do, first.  
12050 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20    ** go through 
12060 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
12070 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20  list and delete 
12080 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65  any other entrie
12090 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a  s besides.    **
120a0 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c   p[] that are al
120b0 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79 20  so supplated by 
120c0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
120d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54   WhereLoop **ppT
120e0 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c  ail = &p->pNextL
120f0 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  oop;.    WhereLo
12100 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20  op *pToDel;.    
12110 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29  while( *ppTail )
12120 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d  {.      ppTail =
12130 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
12140 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65  sser(ppTail, pTe
12150 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69  mplate);.      i
12160 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62  f( ppTail==0 ) b
12170 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44  reak;.      pToD
12180 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20  el = *ppTail;.  
12190 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d      if( pToDel==
121a0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
121b0 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65   *ppTail = pToDe
121c0 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69  l->pNextLoop;.#i
121d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
121e0 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
121f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12200 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
12210 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12220 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12230 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20   delete: ");.   
12240 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
12250 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69  int(pToDel, pBui
12260 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12270 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
12280 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
12290 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20  (db, pToDel);.  
122a0 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c    }.  }.  whereL
122b0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
122c0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
122d0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
122e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
122f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
12300 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
12310 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12320 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12330 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12340 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12350 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12380 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12390 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
123a0 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
123b0 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
123c0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
123d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
123e0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
123f0 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
12400 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
12410 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a  an.** index..*.*
12420 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52  * For every WHER
12430 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12440 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12450 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12460 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20 74  nd which has a t
12470 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12480 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65   assigned by one
12490 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   of the likeliho
124a0 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28  od(),.** likely(
124b0 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29  ), or unlikely()
124c0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20   SQL functions, 
124d0 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
124e0 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  ated number.** o
124f0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
12500 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
12510 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
12520 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65  * TUNING:  For e
12530 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12540 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12550 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12560 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12570 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  h does not have 
12580 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75 74  an assigned trut
12590 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68  h probability, h
125a0 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73  euristics.** des
125b0 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65  cribed below are
125c0 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20   used to try to 
125d0 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  estimate the tru
125e0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a  th probability..
125f0 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68  ** TODO --> Perh
12600 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65  aps this is some
12610 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64  thing that could
12620 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20   be improved by 
12630 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20  better.** table 
12640 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a  statistics..**.*
12650 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20 20  * Heuristic 1:  
12660 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  Estimate the tru
12670 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
12680 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39  s 93.75%.  The 9
12690 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63  3.75%.** value c
126a0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31  orresponds to -1
126b0 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74   in LogEst notat
126c0 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61  ion, so this mea
126d0 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20  ns decrement.** 
126e0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
126f0 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65  ut field for eve
12700 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63 6c  ry such WHERE cl
12710 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a  ause term..**.**
12720 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20 49   Heuristic 2:  I
12730 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
12740 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
12750 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
12760 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d   the.** form "x=
12770 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52 20  =EXPR" and EXPR 
12780 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e  is not a constan
12790 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  t 0 or 1, then m
127a0 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20  ake sure the.** 
127b0 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77  final output row
127c0 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20   estimate is no 
127d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34  greater than 1/4
127e0 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   of the total nu
127f0 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
12800 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
12810 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
12820 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58  ssume that x==EX
12830 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a  PR will filter.*
12840 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33  * out at least 3
12850 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20   out of 4 rows. 
12860 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f   If EXPR is -1 o
12870 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  r 0 or 1, then m
12880 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20  aybe the.** "x" 
12890 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61  column is boolea
128a0 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20  n or else -1 or 
128b0 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d  0 or 1 is a comm
128c0 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  on default value
128d0 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63  .** on the "x" c
128e0 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20  olumn and so in 
128f0 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63  that case only c
12900 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ap the output ro
12910 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74  w estimate.** at
12920 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20   1/2 instead of 
12930 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  1/4..*/.static v
12940 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
12950 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65  putAdjust(.  Whe
12960 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
12970 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
12980 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
12990 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
129a0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
129b0 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61  to adjust downwa
129c0 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rd */.  LogEst n
129d0 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f  Row            /
129e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
129f0 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74   in the entire t
12a00 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
12a10 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
12a20 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
12a30 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
12a40 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
12a50 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
12a60 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f  nt i, j, k;.  Lo
12a70 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30  gEst iReduce = 0
12a80 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e  ;    /* pLoop->n
12a90 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65  Out should not e
12aa0 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75  xceed nRow-iRedu
12ab0 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
12ac0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
12ad0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
12ae0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  DEX)==0 );.  for
12af0 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70  (i=pWC->nTerm, p
12b00 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30  Term=pWC->a; i>0
12b10 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i--, pTerm++){
12b20 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
12b30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
12b40 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72  VIRTUAL)!=0 ) br
12b50 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54  eak;.    if( (pT
12b60 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
12b70 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
12b80 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
12b90 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
12ba0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
12bb0 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f  Allowed)!=0 ) co
12bc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
12bd0 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d  j=pLoop->nLTerm-
12be0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
12bf0 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d       pX = pLoop-
12c00 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
12c10 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
12c20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
12c30 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72  ( pX==pTerm ) br
12c40 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
12c50 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26  X->iParent>=0 &&
12c60 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50   (&pWC->a[pX->iP
12c70 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29  arent])==pTerm )
12c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12c90 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
12ca0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
12cb0 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
12cc0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72        /* If a tr
12cd0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
12ce0 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69  is specified usi
12cf0 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  ng the likelihoo
12d00 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20  d() hints,.     
12d10 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74     ** then use t
12d20 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70  he probability p
12d30 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61  rovided by the a
12d40 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  pplication. */. 
12d50 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
12d60 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
12d70 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
12d80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
12d90 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
12da0 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74 68  f explicit truth
12db0 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20   probabilities, 
12dc0 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20 74  use heuristics t
12dd0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65  o.        ** gue
12de0 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  ss a reasonable 
12df0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12e00 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  y. */.        pL
12e10 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20  oop->nOut--;.   
12e20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
12e30 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
12e40 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
12e50 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
12e60 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
12e70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
12e80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
12e90 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
12ea0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  TK_IS );.       
12eb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12ec0 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69 67  prIsInteger(pRig
12ed0 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d  ht, &k) && k>=(-
12ee0 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20  1) && k<=1 ){.  
12ef0 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30            k = 10
12f00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
12f10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  e{.            k
12f20 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20   = 20;.         
12f30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
12f40 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65   iReduce<k ) iRe
12f50 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20  duce = k;.      
12f60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12f70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
12f80 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69  p->nOut > nRow-i
12f90 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d  Reduce )  pLoop-
12fa0 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69  >nOut = nRow - i
12fb0 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reduce;.}../*.**
12fc0 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   Adjust the cost
12fd0 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75   C by the costMu
12fe0 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54 68  lt facter T.  Th
12ff0 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69  is only occurs i
13000 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69  f.** compiled wi
13010 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42  th -DSQLITE_ENAB
13020 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23  LE_COSTMULT.*/.#
13030 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
13040 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64  BLE_COSTMULT.# d
13050 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d  efine ApplyCostM
13060 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20  ultiplier(C,T)  
13070 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64  C += T.#else.# d
13080 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d  efine ApplyCostM
13090 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23  ultiplier(C,T).#
130a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
130b0 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63  have so far matc
130c0 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  hed pBuilder->pN
130d0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
130e0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a  terms of the .**
130f0 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54   index pIndex. T
13100 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20  ry to match one 
13110 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  more..**.** When
13120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13130 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64  s called, pBuild
13140 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63  er->pNew->nOut c
13150 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20  ontains the .** 
13160 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
13170 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76 69  xpected to be vi
13180 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72 69  sited by filteri
13190 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71  ng using the nEq
131a0 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e   .** terms only.
131b0 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69   If it is modifi
131c0 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69  ed, this value i
131d0 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72  s restored befor
131e0 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
131f0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
13200 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
13210 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
13220 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
13230 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
13240 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
13250 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
13260 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
13270 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
13280 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
13290 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
132a0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
132b0 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
132c0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
132d0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
132e0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
132f0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
13300 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
13310 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
13320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13330 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
13340 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d  */.  LogEst nInM
13350 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ul              
13360 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62       /* log(Numb
13370 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
13380 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29   due to IN) */.)
13390 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
133a0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
133b0 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48  ->pWInfo;  /* WH
133c0 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74  ERE analyse cont
133d0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
133e0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
133f0 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
13400 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13410 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
13420 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13430 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
13440 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  ase connection m
13450 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f  alloc context */
13460 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
13470 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
13480 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
13490 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63  hereLoop under c
134a0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
134b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
134c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
134d0 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20   /* A WhereTerm 
134e0 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74  under considerat
134f0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d  ion */.  int opM
13500 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
13510 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
13520 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  d operators for 
13530 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
13540 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
13570 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a   WHERE terms */.
13580 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f    Bitmask saved_
13590 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20  prereq;         
135a0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
135b0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65  lue of pNew->pre
135c0 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  req */.  u16 sav
135d0 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  ed_nLTerm;      
135e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
135f0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
13600 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20  ew->nLTerm */.  
13610 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20  u16 saved_nEq;  
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13630 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
13640 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
13650 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20  ee.nEq */.  u16 
13660 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20  saved_nSkip;    
13670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13680 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
13690 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a   pNew->nSkip */.
136a0 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
136b0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
136c0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
136d0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
136e0 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  lags */.  LogEst
136f0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
13700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
13710 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
13720 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
13730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13740 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
13750 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
13760 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13790 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
137a0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
137b0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
137c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
137d0 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a  thm of table siz
137e0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
137f0 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74   *pTop = 0, *pBt
13800 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e  m = 0; /* Top an
13810 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63  d bottom range c
13820 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
13830 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
13840 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62  ->pNew;.  if( db
13850 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13870 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28  OMEM;..  assert(
13880 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
13890 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
138a0 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ABLE)==0 );.  as
138b0 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
138c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
138d0 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20  _LIMIT)==0 );.  
138e0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
138f0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
13900 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  MIT ){.    opMas
13910 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  k = WO_LT|WO_LE;
13920 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70  .  }else if( /*p
13930 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c  Probe->tnum<=0 |
13940 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  |*/ (pSrc->fg.jo
13950 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
13960 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
13970 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
13980 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
13990 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
139a0 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
139b0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
139c0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
139d0 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _LE|WO_ISNULL|WO
139e0 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _IS;.  }.  if( p
139f0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
13a00 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28  d ) opMask &= ~(
13a10 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
13a20 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73  T|WO_LE);..  ass
13a30 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ert( pNew->u.btr
13a40 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  ee.nEq<pProbe->n
13a50 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76  Column );..  sav
13a60 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
13a70 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
13a80 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77  ved_nSkip = pNew
13a90 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  ->nSkip;.  saved
13aa0 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
13ab0 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
13ac0 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
13ad0 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
13ae0 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
13af0 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
13b00 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
13b10 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  t;.  pTerm = whe
13b20 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
13b30 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
13b40 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
13b50 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20  saved_nEq,.     
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
13b80 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  e);.  pNew->rSet
13b90 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20  up = 0;.  rSize 
13ba0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
13bb0 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67  ogEst[0];.  rLog
13bc0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
13bd0 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63  ize);.  for(; rc
13be0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
13bf0 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
13c00 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
13c10 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
13c20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
13c30 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
13c40 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
13c50 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
13c60 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
13c70 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
13c80 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
13c90 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
13ca0 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
13cb0 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
13cc0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
13cd0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
13ce0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13cf0 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20  R_STAT4.    int 
13d00 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
13d10 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
13d20 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
13d30 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  (eOp==WO_ISNULL 
13d40 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
13d50 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
13d60 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78  0).     && index
13d70 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50  ColumnNotNull(pP
13d80 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29  robe, saved_nEq)
13d90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
13da0 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72  ntinue; /* ignor
13db0 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20  e IS [NOT] NULL 
13dc0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e  constraints on N
13dd0 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
13de0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
13df0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
13e00 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
13e10 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
13e20 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
13e30 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20  allow the upper 
13e40 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20  bound of a LIKE 
13e50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e  optimization ran
13e60 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ge constraint.  
13e70 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68    ** to mix with
13e80 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62   a lower range b
13e90 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f  ound from some o
13ea0 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20  ther source */. 
13eb0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
13ec0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
13ed0 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65  EOPT && pTerm->e
13ee0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
13ef0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
13f00 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
13f10 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
13f20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
13f30 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
13f40 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  q;.    pNew->nLT
13f50 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
13f60 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
13f70 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
13f80 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
13f90 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
13fa0 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
13fb0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
13fc0 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
13fd0 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
13fe0 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
13ff0 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
14000 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
14010 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20  w->maskSelf;..  
14020 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c    assert( nInMul
14030 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ==0.        || (
14040 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
14050 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
14060 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  L)!=0 .        |
14070 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
14080 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
14090 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  IN)!=0 .        
140a0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
140b0 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
140c0 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a  AN)!=0 .    );..
140d0 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
140e0 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
140f0 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
14100 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
14110 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
14120 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
14130 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
14140 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
14150 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
14160 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
14170 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
14180 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20  ":  TUNING: the 
14190 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
141a0 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
141b0 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
141c0 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
141d0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
141e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
141f0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
14200 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
14210 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
14220 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
14230 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
14240 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
14250 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
14260 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
14270 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
14280 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
14290 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a  rt( nIn>0 );  /*
142a0 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20   RHS always has 
142b0 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e  2 or more terms.
142c0 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20  ..  The parser. 
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142e0 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
142f0 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
14300 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20  o "x=?". */..   
14310 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
14320 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
14330 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
14340 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
14350 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  umn[saved_nEq];.
14360 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14370 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
14380 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73  UMN_EQ;.      as
14390 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d  sert( saved_nEq=
143a0 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  =pNew->u.btree.n
143b0 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq );.      if( 
143c0 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a  iCol==XN_ROWID .
143d0 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e         || (iCol>
143e0 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26  0 && nInMul==0 &
143f0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
14400 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a  obe->nKeyCol-1).
14410 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14420 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
14430 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e  pProbe->uniqNotN
14440 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
14450 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14460 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57  s |= WHERE_UNQ_W
14470 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d  ANTED;.        }
14480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14490 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
144a0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
144b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
144c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
144d0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
144e0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
144f0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
14500 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
14510 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
14520 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
14530 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14540 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a   eOp & WO_GT );.
14550 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14560 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  eOp & WO_GE );. 
14570 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
14580 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
14590 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
145a0 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
145b0 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
145c0 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
145d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
145e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
145f0 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20  KEOPT ){.       
14600 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61   /* Range contra
14610 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66  ints that come f
14620 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  rom the LIKE opt
14630 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20  imization are.  
14640 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
14650 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a  used in pairs. *
14660 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d  /.        pTop =
14670 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20   &pTerm[1];.    
14680 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 6f      assert( (pTo
14690 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  p-(pTerm->pWC->a
146a0 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e  ))<pTerm->pWC->n
146b0 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Term );.        
146c0 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74  assert( pTop->wt
146d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
146e0 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20  EOPT );.        
146f0 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f  assert( pTop->eO
14700 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29  perator==WO_LT )
14710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  ;.        if( wh
14720 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
14730 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
14740 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
14750 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20   /* OOM */.     
14760 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
14770 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
14780 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20  = pTop;.        
14790 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
147a0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
147b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
147c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
147d0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c  t( eOp & (WO_LT|
147e0 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20  WO_LE) );.      
147f0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
14800 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_LT );.      t
14810 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
14820 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_LE );.      pN
14830 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14840 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
14850 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  E|WHERE_TOP_LIMI
14860 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  T;.      pTop = 
14870 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74  pTerm;.      pBt
14880 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  m = (pNew->wsFla
14890 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
148a0 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20  IMIT)!=0 ?.     
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
148d0 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30  w->nLTerm-2] : 0
148e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
148f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e  At this point pN
14900 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20  ew->nOut is set 
14910 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
14920 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74   rows expected t
14930 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69  o.    ** be visi
14940 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  ted by the index
14950 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e   scan before con
14960 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54  sidering term pT
14970 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  erm, or the.    
14980 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e  ** values of nIn
14990 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20   and nInMul. In 
149a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73  other words, ass
149b0 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a  uming that all .
149c0 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e      ** "x IN(...
149d0 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65 70  )" terms are rep
149e0 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d 20  laced with "x = 
149f0 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75  ?". This block u
14a00 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68  pdates.    ** th
14a10 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  e value of pNew-
14a20 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74  >nOut to account
14a30 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20   for pTerm (but 
14a40 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e  not nIn/nInMul).
14a50 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14a60 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
14a70 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69  ed_nOut );.    i
14a80 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
14a90 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
14aa0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
14ab0 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73  * Adjust nOut us
14ac0 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34 20  ing stat3/stat4 
14ad0 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65  data. Or, if the
14ae0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73  re is no stat3/s
14af0 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61  tat4.      ** da
14b00 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f  ta, using some o
14b10 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20  ther estimate.  
14b20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61  */.      whereRa
14b30 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
14b40 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74  e, pBuilder, pBt
14b50 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a  m, pTop, pNew);.
14b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14b70 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65   int nEq = ++pNe
14b80 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
14b90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
14ba0 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
14bb0 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
14bc0 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ) );..      asse
14bd0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
14be0 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
14bf0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
14c00 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70  ruthProb<=0 && p
14c10 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
14c20 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b  saved_nEq]>=0 ){
14c30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14c40 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c   (eOp & WO_IN) |
14c50 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  | nIn==0 );.    
14c60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14c70 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  p & WO_IN );.   
14c80 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
14c90 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
14ca0 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  rob;.        pNe
14cb0 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
14cc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
14cd0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14ce0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
14cf0 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
14d00 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
14d10 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
14d20 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50   .         && pP
14d30 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
14d40 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
14d50 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
14d60 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
14d70 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
14d80 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
14d90 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
14da0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
14db0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
14dc0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14dd0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
14de0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
14df0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
14e00 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
14e10 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d  ISNULL|WO_IS))!=
14e20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14e30 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14e40 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
14e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e60 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
14e70 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
14e80 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
14e90 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
14ea0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
14eb0 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
14ec0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14ed0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
14ee0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
14ef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
14f00 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
14f10 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
14f20 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
14f30 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
14f40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14f50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14f60 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
14f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14f80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
14f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
14fa0 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ak;          /* 
14fb0 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  Jump out of the 
14fc0 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20  pTerm loop */.  
14fd0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
14fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14ff0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
15000 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
15010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15020 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
15030 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
15040 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
15050 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
15060 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
15070 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15090 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65  if( nOut==0 ).#e
150a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
150b0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
150c0 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e  Out += (pProbe->
150d0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d  aiRowLogEst[nEq]
150e0 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
150f0 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a  LogEst[nEq-1]);.
15100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
15110 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
15120 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
15130 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
15140 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f   is no likelihoo
15150 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d  d() value, assum
15160 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
15170 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53        ** "col IS
15180 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f   NULL" expressio
15190 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20  n matches twice 
151a0 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20  as many rows .  
151b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
151c0 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20  (col=?). */.    
151d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
151e0 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  ut += 10;.      
151f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15210 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49     /* Set rCostI
15220 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  dx to the cost o
15230 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63  f visiting selec
15240 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65  ted rows in inde
15250 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74  x. Add.    ** it
15260 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20   to pNew->rRun, 
15270 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74  which is current
15280 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  ly set to the co
15290 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  st of the index.
152a0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79      ** seek only
152b0 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
152c0 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
152d0 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65  g index, add the
152e0 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20   cost of.    ** 
152f0 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77  visiting the row
15300 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
15310 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f  ble.  */.    rCo
15320 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f  stIdx = pNew->nO
15330 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ut + 1 + (15*pPr
15340 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
15350 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62  Src->pTab->szTab
15360 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Row;.    pNew->r
15370 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
15380 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
15390 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20   rCostIdx);.    
153a0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
153b0 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
153c0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
153d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
153e0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
153f0 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
15400 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
15410 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20  t + 16);.    }. 
15420 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
15430 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
15440 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c  n, pProbe->pTabl
15450 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20  e->costMult);.. 
15460 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
15470 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
15480 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
15490 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
154a0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
154b0 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
154c0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
154d0 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
154e0 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72  er->pWC, pNew, r
154f0 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Size);.    rc = 
15500 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
15510 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
15520 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ..    if( pNew->
15530 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15540 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
15550 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15560 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
15570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15580 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75  pNew->nOut = nOu
15590 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20  tUnadjusted;.   
155a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65   }..    if( (pNe
155b0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
155c0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
155d0 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
155e0 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
155f0 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  e->nColumn.    )
15600 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
15610 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
15620 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
15630 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
15640 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
15650 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
15660 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
15670 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15680 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
15690 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
156a0 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
156b0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
156c0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
156d0 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
156e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
156f0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
15700 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
15710 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
15720 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
15730 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
15740 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
15750 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
15760 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
15770 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
15780 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
15790 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
157a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
157b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
157c0 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
157d0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
157e0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
157f0 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
15800 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
15810 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
15820 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
15830 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
15840 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
15850 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
15860 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
15870 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
15880 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
15890 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
158a0 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
158b0 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
158c0 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
158d0 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
158e0 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
158f0 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
15900 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
15910 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
15920 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
15930 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
15940 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
15950 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
15960 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
15970 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
15980 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
15990 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
159a0 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
159b0 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
159c0 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
159d0 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
159e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
159f0 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
15a00 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
15a10 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
15a20 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
15a30 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
15a40 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
15a50 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
15a60 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
15a70 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
15a80 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
15a90 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
15aa0 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
15ab0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15ac0 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15ad0 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
15ae0 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
15af0 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
15b00 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
15b10 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
15b20 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
15b30 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
15b40 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
15b50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15b60 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
15b70 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
15b80 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15b90 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
15ba0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
15bb0 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
15bc0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
15bd0 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
15be0 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
15bf0 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
15c00 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
15c10 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
15c20 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
15c30 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
15c40 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
15c50 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
15c60 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
15c70 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
15c80 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
15c90 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
15ca0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
15cb0 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
15cc0 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
15cd0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15ce0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
15cf0 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
15d00 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
15d10 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
15d20 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
15d30 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15d40 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65  Flags;.  }..  re
15d50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15d60 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
15d70 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
15d80 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
15d90 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
15da0 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
15db0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
15dc0 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
15dd0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
15de0 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
15df0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
15e00 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15e10 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
15e20 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
15e30 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
15e40 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
15e50 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
15e60 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
15e70 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
15e80 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
15e90 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
15ea0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
15eb0 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
15ec0 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
15ed0 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
15ee0 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73   *pOB;.  ExprLis
15ef0 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69  t *aColExpr;.  i
15f00 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
15f10 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
15f20 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
15f30 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
15f40 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
15f50 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
15f60 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
15f70 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
15f80 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
15f90 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
15fa0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
15fb0 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ate(pOB->a[ii].p
15fc0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
15fd0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
15fe0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
15ff0 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
16000 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
16010 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
16020 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f  turn 1;.      fo
16030 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
16040 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
16050 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
16060 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
16070 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
16080 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
16090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
160a0 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20  e if( (aColExpr 
160b0 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  = pIndex->aColEx
160c0 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pr)!=0 ){.      
160d0 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
160e0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a  dex->nKeyCol; jj
160f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16100 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
16110 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29  n[jj]!=XN_EXPR )
16120 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16130 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
16140 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c  prCompare(pExpr,
16150 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e  aColExpr->a[jj].
16160 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d  pExpr,iCursor)==
16170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
16180 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
16190 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
161a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
161b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
161c0 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65   a bitmask where
161d0 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61   1s indicate tha
161e0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
161f0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  ing column of.**
16200 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73   the table is us
16210 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
16220 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
16230 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  63 columns are c
16240 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74  onsidered..*/.st
16250 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c  atic Bitmask col
16260 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65  umnsInIndex(Inde
16270 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
16280 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
16290 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
162a0 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
162b0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
162c0 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
162d0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
162e0 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  x>=0 ){.      te
162f0 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
16300 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16310 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
16320 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
16330 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
16340 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
16350 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
16360 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
16370 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
16380 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78   with pPartIndex
16390 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65  Where can be use
163a0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  d.** in the curr
163b0 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75  ent query.  Retu
163c0 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61  rn true if it ca
163d0 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69  n be and false i
163e0 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
163f0 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65   int whereUsable
16400 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74  PartialIndex(int
16410 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75   iTab, WhereClau
16420 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
16430 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Where){.  int i;
16440 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
16450 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  erm;.  while( pW
16460 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
16470 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65   ){.    if( !whe
16480 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
16490 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57  ndex(iTab,pWC,pW
164a0 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72  here->pLeft) ) r
164b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68  eturn 0;.    pWh
164c0 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52  ere = pWhere->pR
164d0 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ight;.  }.  for(
164e0 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  i=0, pTerm=pWC->
164f0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
16500 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
16510 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
16520 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
16530 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
16540 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
16550 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54  Expr, pWhere, iT
16560 61 62 29 20 0a 20 20 20 20 20 26 26 20 28 21 45  ab) .     && (!E
16570 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16580 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
16590 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69  n) || pExpr->iRi
165a0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54  ghtJoinTable==iT
165b0 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ab).    ){.     
165c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
165d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
165e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
165f0 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
16600 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  cts for a single
16610 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
16620 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62  in where the tab
16630 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65  le.** is idenfie
16640 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
16650 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
16660 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
16670 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
16680 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
16690 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
166a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73  e..**.** The cos
166b0 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52  ts (WhereLoop.rR
166c0 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65  un) of the b-tre
166d0 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79  e loops added by
166e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
166f0 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  * are calculated
16700 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16710 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63  ** For a full sc
16720 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  an, assuming the
16730 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78   table (or index
16740 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20  ) contains nRow 
16750 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rows:.**.**     
16760 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e  cost = nRow * 3.
16770 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
16780 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62       // full-tab
16790 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63  le scan.**     c
167a0 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20  ost = nRow * K  
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63      // scan of c
167d0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
167e0 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
167f0 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20   * (K+3.0)      
16800 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
16810 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  n of non-coverin
16820 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68  g index.**.** wh
16830 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65  ere K is a value
16840 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
16850 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f   3.0 set based o
16860 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a  n the relative .
16870 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65  ** estimated ave
16880 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65  rage size of the
16890 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
168a0 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
168b0 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61  For an index sca
168c0 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20  n, where nVisit 
168d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
168e0 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69   index rows visi
168f0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63  ted.** by the sc
16900 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73  an, and nSeek is
16910 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
16920 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  eek operations r
16930 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74  equired on .** t
16940 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a  he index b-tree:
16950 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
16960 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
16970 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69  Row) + K * nVisi
16980 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63  t)          // c
16990 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
169a0 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65       cost = nSee
169b0 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b  k * (log(nRow) +
169c0 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69   (K+3.0) * nVisi
169d0 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76  t)    // non-cov
169e0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
169f0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65  * Normally, nSee
16a00 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61  k is 1. nSeek va
16a10 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
16a20 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69  n 1 come about i
16a30 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20  f the .** WHERE 
16a40 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20  clause includes 
16a50 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65  "x IN (....)" te
16a60 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63  rms used in plac
16a70 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77  e of "x=?". Or w
16a80 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74  hen .** implicit
16a90 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78   "x IN (SELECT x
16aa0 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d   FROM tbl)" term
16ab0 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20  s are added for 
16ac0 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a  skip-scans..**.*
16ad0 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20  * The estimated 
16ae0 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56  values (nRow, nV
16af0 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74  isit, nSeek) oft
16b00 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72  en contain a lar
16b10 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  ge amount.** of 
16b20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f  uncertainty.  Fo
16b30 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73  r this reason, s
16b40 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e  coring is design
16b50 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73  ed to pick plans
16b60 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65   that.** "do the
16b70 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20   least harm" if 
16b80 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72  the estimates ar
16b90 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46  e inaccurate.  F
16ba0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a  or example, a.**
16bb0 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f   log(nRow) facto
16bc0 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
16bd0 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  m a non-covering
16be0 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f   index scan in o
16bf0 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20  rder to.** bias 
16c00 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66  the scoring in f
16c10 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e  avor of using an
16c20 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68   index, since th
16c30 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20  e worst-case.** 
16c40 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75  performance of u
16c50 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73  sing an index is
16c60 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e   far better than
16c70 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20   the worst-case 
16c80 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f  performance.** o
16c90 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
16ca0 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  can..*/.static i
16cb0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
16cc0 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
16cd0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
16ce0 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
16cf0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
16d00 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
16d10 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
16d20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
16d30 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
16d40 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
16d50 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
16d60 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
16d70 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
16d80 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
16d90 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
16da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16db0 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
16dc0 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
16dd0 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
16de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16df0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
16e00 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
16e10 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  y key */.  LogEs
16e20 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
16e30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69         /* The ai
16e40 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75  RowLogEst[] valu
16e50 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
16e60 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43  dex */.  i16 aiC
16e70 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
16e80 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
16e90 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
16ea0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
16eb0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
16ec0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
16ed0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
16ee0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
16ef0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
16f00 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ;  /* The FROM c
16f10 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d  lause btree term
16f20 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65   to add */.  Whe
16f30 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
16f40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
16f50 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  late WhereLoop o
16f60 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
16f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
16f80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16f90 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
16fa0 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20  SortIdx = 1;    
16fb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16fc0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
16fd0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16fe0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f          /* A boo
16ff0 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  lean value */.  
17000 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
17010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
17020 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
17030 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
17040 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
17050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17060 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
17070 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
17080 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
17090 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
170a0 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
170b0 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45  The parsed WHERE
170c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62   clause */.  Tab
170d0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
170e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
170f0 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
17100 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70  */.  .  pNew = p
17110 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
17120 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
17130 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54  er->pWInfo;.  pT
17140 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
17150 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72  >pTabList;.  pSr
17160 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  c = pTabList->a 
17170 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
17180 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
17190 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
171a0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
171b0 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
171c0 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
171d0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e   if( pSrc->pIBIn
171e0 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
171f0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
17200 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
17210 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
17220 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
17230 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42  robe = pSrc->pIB
17240 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69  Index;.  }else i
17250 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
17260 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  b) ){.    pProbe
17270 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
17280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17290 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
172a0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
172b0 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
172c0 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
172d0 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
172e0 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
172f0 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
17300 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
17310 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
17320 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
17330 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
17340 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
17350 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
17360 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
17370 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
17380 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
17390 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
173a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
173b0 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
173c0 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
173d0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
173e0 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
173f0 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
17400 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  nKeyCol = 1;.   
17410 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
17420 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
17430 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
17440 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c  ;.    sPk.aiRowL
17450 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  ogEst = aiRowEst
17460 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
17470 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
17480 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
17490 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b   = pTab;.    sPk
174a0 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
174b0 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
174c0 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
174d0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
174e0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
174f0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  [1] = 0;.    pFi
17500 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
17510 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
17520 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e  ( pSrc->fg.notIn
17530 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
17540 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
17550 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
17560 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
17570 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
17580 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
17590 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
175a0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
175b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
175c0 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
175d0 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
175e0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
175f0 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
17600 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
17610 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
17620 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
17630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17640 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
17650 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
17660 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
17670 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
17680 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f  OrSet      /* No
17690 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20  t part of an OR 
176a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a  optimization */.
176b0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
176c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
176d0 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 29 3d  E_NO_AUTOINDEX)=
176e0 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
176f0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ->pParse->db->fl
17700 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
17710 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26  oIndex)!=0.   &&
17720 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d   pSrc->pIBIndex=
17730 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e  =0      /* Has n
17740 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
17750 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  use */.   && !pS
17760 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
17770 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f  d   /* Has no NO
17780 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
17790 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77   */.   && HasRow
177a0 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20 20  id(pTab)        
177b0 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20   /* Not WITHOUT 
177c0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49  ROWID table. (FI
177d0 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a  XME: Why not?) *
177e0 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
177f0 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f  g.isCorrelated /
17800 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
17810 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
17820 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69    && !pSrc->fg.i
17830 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e  sRecursive  /* N
17840 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63  ot a recursive c
17850 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
17860 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a  ession. */.  ){.
17870 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
17880 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65  auto-index Where
17890 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65  Loops */.    Whe
178a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
178b0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
178c0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
178d0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
178e0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
178f0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
17900 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
17910 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
17920 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
17930 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
17940 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
17950 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
17960 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
17970 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
17980 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
17990 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
179a0 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
179b0 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
179c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
179d0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
179e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
179f0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
17a00 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
17a10 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
17a20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
17a30 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
17a40 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
17a50 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
17a60 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61         ** estima
17a70 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f  ted to be X*N*lo
17a80 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
17a90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17aa0 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ows in.        *
17ab0 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
17ac0 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68  g indexed and wh
17ad0 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45  ere X is 7 (LogE
17ae0 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61  st=28) for norma
17af0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  l.        ** tab
17b00 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f  les or 1.375 (Lo
17b10 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77  gEst=4) for view
17b20 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17b30 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20  .  The value.   
17b40 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20       ** of X is 
17b50 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77  smaller for view
17b60 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17b70 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65   so that the que
17b80 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20  ry planner.     
17b90 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f     ** will be mo
17ba0 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62  re aggressive ab
17bb0 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
17bc0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
17bd0 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
17be0 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73  those objects, s
17bf0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ince there is no
17c00 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
17c10 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20  add schema.     
17c20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e     ** indexes on
17c30 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
17c40 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  views. */.      
17c50 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
17c60 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
17c70 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69  e + 4;.        i
17c80 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
17c90 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61  ==0 && (pTab->ta
17ca0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
17cb0 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  meral)==0 ){.   
17cc0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
17cd0 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20  tup += 24;.     
17ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
17cf0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
17d00 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70  (pNew->rSetup, p
17d10 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
17d20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
17d30 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
17d40 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
17d50 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
17d60 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
17d70 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
17d80 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
17d90 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
17da0 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
17db0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
17dc0 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
17dd0 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
17de0 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
17df0 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
17e00 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
17e10 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
17e20 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
17e30 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
17e40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
17e50 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
17e60 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
17e70 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
17e80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
17e90 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
17ea0 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
17eb0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
17ec0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
17ed0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
17ee0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
17ef0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
17f00 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
17f10 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
17f20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
17f30 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
17f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17f50 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
17f60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
17f70 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
17f80 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
17f90 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
17fa0 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
17fb0 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
17fc0 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
17fd0 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
17fe0 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
17ff0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
18000 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
18010 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
18020 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f  dex(pSrc->iCurso
18030 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  r, pWC, pProbe->
18040 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
18050 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
18060 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53  ( pNew->iTab!=pS
18070 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20  rc->iCursor );  
18080 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39  /* See ticket [9
18090 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20  8d973b8f5] */.  
180a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
180b0 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
180c0 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
180d0 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
180e0 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20      }.    rSize 
180f0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
18100 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e  ogEst[0];.    pN
18110 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
18120 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
18130 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
18140 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
18150 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
18160 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
18170 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
18180 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
18190 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
181a0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
181b0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
181c0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
181d0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
181e0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
181f0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
18200 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
18210 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
18220 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
18230 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
18240 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
18250 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
18260 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
18270 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
18280 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
18290 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
182a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
182b0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
182c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
182d0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
182e0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
182f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
18300 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
18310 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
18320 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
18330 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
18340 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
18350 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
18360 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
18370 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
18380 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
18390 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
183a0 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
183b0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
183c0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
183d0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
183e0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
183f0 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
18400 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
18410 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
18420 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
18430 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
18440 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
18450 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
18460 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
18470 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
18480 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
18490 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
184a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
184b0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
184c0 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
184d0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
184e0 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
184f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18500 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
18510 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
18520 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
18530 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
18540 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
18550 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
18560 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
18570 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
18580 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
18590 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
185a0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
185b0 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
185c0 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
185d0 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
185e0 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
185f0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
18600 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
18610 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
18620 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
18630 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
18640 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
18650 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
18660 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
18670 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
18680 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
18690 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
186a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
186b0 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
186c0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
186d0 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
186e0 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
186f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
18700 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
18710 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
18720 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
18730 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
18740 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
18750 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
18760 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
18770 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
18780 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
18790 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
187a0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
187b0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
187c0 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73  rows. If this is
187d0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
187e0 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20  index scan,.    
187f0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20      ** also add 
18800 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
18810 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20  ting table rows 
18820 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20  (N*3.0).  */.   
18830 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
18840 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
18850 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
18860 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
18870 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
18880 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
18890 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
188a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
188b0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a  pNew->rRun, rSiz
188c0 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  e+16);.        }
188d0 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
188e0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
188f0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
18900 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
18910 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
18920 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
18930 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
18940 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18950 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
18960 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
18970 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
18980 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
18990 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
189a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
189b0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
189c0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
189d0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
189e0 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
189f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18a00 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
18a10 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
18a20 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
18a30 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
18a40 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
18a50 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
18a60 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
18a70 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
18a80 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
18a90 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
18aa0 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
18ab0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
18ac0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
18ad0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
18ae0 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  BIndex ) break;.
18af0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18b00 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
18b10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18b20 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ABLE./*.** Add a
18b30 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
18b40 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
18b50 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
18b60 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
18b70 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
18b80 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
18b90 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18ba0 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
18bb0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
18bc0 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20  ere are no LEFT 
18bd0 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f  or CROSS JOIN jo
18be0 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ins in the query
18bf0 2c 20 62 6f 74 68 20 6d 45 78 74 72 61 20 61 6e  , both mExtra an
18c00 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61  d.** mUnusable a
18c10 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68  re set to 0. Oth
18c20 65 72 77 69 73 65 2c 20 6d 45 78 74 72 61 20 69  erwise, mExtra i
18c30 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
18c40 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
18c50 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
18c60 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
18c70 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
18c80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
18c90 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
18ca0 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
18cb0 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
18cc0 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
18cd0 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
18ce0 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
18cf0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
18d00 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
18d10 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
18d20 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
18d30 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
18d40 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
18d50 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
18d60 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
18d70 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
18d80 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
18d90 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
18da0 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
18db0 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
18dc0 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
18dd0 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
18de0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45 78 74 72  **.** then mExtr
18df0 61 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  a corresponds to
18e00 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55   (t1, t2) and mU
18e10 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20  nusable to (t5, 
18e20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  t6)..**.** All t
18e30 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 45 78  he tables in mEx
18e40 74 72 61 20 6d 75 73 74 20 62 65 20 73 63 61 6e  tra must be scan
18e50 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ned before the c
18e60 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a  urrent virtual .
18e70 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79  ** table. So any
18e80 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
18e90 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74   all prerequisit
18ea0 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  es are satisfied
18eb0 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72 61 20 6d   by .** mExtra m
18ec0 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20  ay be specified 
18ed0 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61  as "usable" in a
18ee0 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  ll calls to xBes
18ef0 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76  tIndex. .** Conv
18f00 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c  ersely, all tabl
18f10 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20  es in mUnusable 
18f20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
18f30 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
18f40 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  t.** virtual tab
18f50 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73  le, so any terms
18f60 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
18f70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 76 65  rerequisites ove
18f80 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e  rlap with.** mUn
18f90 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c  usable should al
18fa0 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72  ways be configur
18fb0 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c  ed as "not-usabl
18fc0 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65  e" for xBestInde
18fd0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
18fe0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
18ff0 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
19000 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
19010 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
19020 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
19030 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
19040 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
19050 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
19060 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
19070 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e  d before this on
19080 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  e */.  Bitmask m
19090 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20 20  Unusable        
190a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
190b0 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
190c0 65 64 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e  ed after this on
190d0 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
190e0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
190f0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
19100 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
19110 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
19120 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
19130 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
19140 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
19150 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19170 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
19180 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
19190 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
191a0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
191b0 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
191c0 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  rch */.  Table *
191d0 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
191e0 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  *db;.  sqlite3_i
191f0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
19200 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
19210 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
19220 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
19230 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
19240 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
19250 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
19260 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
19270 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
19280 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  j;.  int iTerm, 
19290 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43  mxTerm;.  int nC
192a0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
192b0 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20   seenIn = 0;    
192c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
192d0 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  e if an IN opera
192e0 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  tor is seen */. 
192f0 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30   int seenVar = 0
19300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19310 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63   True if a non-c
19320 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69  onstant constrai
19330 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
19340 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20  int iPhase;     
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19360 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c  0: const w/o IN,
19370 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f   1: const, 2: no
19380 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20   IN,  2: IN */. 
19390 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
193a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
193b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
193c0 74 28 20 28 6d 45 78 74 72 61 20 26 20 6d 55 6e  t( (mExtra & mUn
193d0 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
193e0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
193f0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
19400 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
19410 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
19420 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d  rse->db;.  pWC =
19430 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
19440 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
19450 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20  r->pNew;.  pSrc 
19460 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
19470 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61  ist->a[pNew->iTa
19480 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  b];.  pTab = pSr
19490 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  c->pTab;.  asser
194a0 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  t( IsVirtual(pTa
194b0 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f  b) );.  pIdxInfo
194c0 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
194d0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
194e0 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72  , mUnusable, pSr
194f0 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  c,pBuilder->pOrd
19500 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
19510 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
19520 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
19530 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
19540 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
19550 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
19560 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
19570 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
19580 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
19590 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
195a0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
195b0 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
195c0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
195d0 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
195e0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
195f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
19600 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
19610 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
19620 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
19630 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19640 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
19650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19660 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
19670 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
19680 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
19690 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
196a0 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
196b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
196c0 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
196d0 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
196e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
196f0 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
19700 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
19710 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
19720 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
19730 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
19740 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
19750 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
19760 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
19770 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
19780 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
19790 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
197a0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
197b0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
197c0 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
197d0 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
197e0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
197f0 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
19800 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
19810 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
19820 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
19830 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
19840 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19850 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
19860 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
19870 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
19880 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19890 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
198a0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
198b0 26 20 7e 6d 45 78 74 72 61 29 21 3d 30 20 29 7b  & ~mExtra)!=0 ){
198c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
198d0 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  nVar = 1;.      
198e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
198f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
19900 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20  & WO_IN)==0 ){. 
19910 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43             pIdxC
19920 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
19930 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19940 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19950 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20        case 1:   
19960 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
19970 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  th IN operators 
19980 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19990 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20  ert( seenIn );. 
199a0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
199b0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
199c0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
199d0 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30 3b 0a 20  & ~mExtra)==0;. 
199e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
199f0 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20          case 2: 
19a00 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
19a10 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20  without IN */.  
19a20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19a30 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20  seenVar );.     
19a40 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
19a50 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
19a60 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19a70 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  N)==0;.         
19a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19a90 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61  default:   /* Va
19aa0 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20  riables with IN 
19ab0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19ac0 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20  ert( seenVar && 
19ad0 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
19ae0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
19af0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
19b00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19b10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d   }.    }.    mem
19b20 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73  set(pUsage, 0, s
19b30 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29  izeof(pUsage[0])
19b40 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  *pIdxInfo->nCons
19b50 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  traint);.    if(
19b60 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
19b70 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
19b80 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
19b90 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
19ba0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
19bb0 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
19bc0 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
19bd0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
19be0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
19bf0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
19c00 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
19c10 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  med = 0;.    pId
19c20 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
19c30 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
19c40 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29  G_DBL / (double)
19c50 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  2;.    pIdxInfo-
19c60 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
19c70 20 32 35 3b 0a 20 20 20 20 70 49 64 78 49 6e 66   25;.    pIdxInf
19c80 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b  o->idxFlags = 0;
19c90 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63  .    pIdxInfo->c
19ca0 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65  olUsed = (sqlite
19cb0 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f  3_int64)pSrc->co
19cc0 6c 55 73 65 64 3b 0a 20 20 20 20 72 63 20 3d 20  lUsed;.    rc = 
19cd0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
19ce0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
19cf0 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
19d00 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
19d10 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
19d20 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
19d30 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19d40 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19d50 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19d60 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
19d70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
19d80 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
19d90 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
19da0 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
19db0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
19dc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19dd0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
19de0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
19df0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19e00 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19e10 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19e20 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19e30 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19e40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
19e50 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
19e60 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
19e70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19e80 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19e90 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
19ea0 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
19eb0 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
19ec0 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
19ed0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
19ee0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
19ef0 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
19f00 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
19f10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19f20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19f40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
19f50 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
19f60 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
19f70 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
19f80 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
19f90 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
19fa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19fb0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
19fc0 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
19fd0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
19fe0 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
19ff0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a000 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
1a010 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
1a020 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
1a030 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1a040 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
1a050 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1a060 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
1a070 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
1a080 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a090 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1a0a0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
1a0b0 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
1a0c0 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
1a0d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a0e0 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1a0f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a100 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
1a110 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
1a120 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1a130 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1a140 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1a150 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1a160 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1a170 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1a180 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
1a190 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
1a1a0 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
1a1b0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a1c0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
1a1d0 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
1a1e0 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
1a1f0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1a200 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
1a210 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
1a220 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
1a230 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
1a240 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
1a250 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
1a260 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
1a270 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
1a280 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
1a290 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
1a2a0 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
1a2b0 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
1a2c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a2d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a2e0 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1a2f0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1a300 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1a310 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1a320 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
1a330 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
1a340 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1a350 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
1a360 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
1a370 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
1a380 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1a390 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1a3a0 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1a3b0 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1a3c0 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
1a3d0 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
1a3e0 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
1a3f0 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
1a400 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1a410 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1a420 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a430 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1a440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a450 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1a460 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1a470 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1a480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a490 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a4a0 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
1a4b0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
1a4c0 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
1a4d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a4e0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
1a4f0 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1a500 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1a510 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
1a520 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
1a530 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a540 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1a550 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1a560 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
1a570 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1a580 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
1a590 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1a5a0 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
1a5b0 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
1a5c0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
1a5d0 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49  rdered = (i8)(pI
1a5e0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1a5f0 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20  onsumed ?.      
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 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
1a630 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  By : 0);.      p
1a640 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1a650 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1a660 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1a670 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
1a680 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1a690 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
1a6a0 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
1a6b0 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
1a6c0 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
1a6d0 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
1a6e0 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1a6f0 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65 73  flag if the xBes
1a700 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1a710 69 6e 64 69 63 61 74 65 64 0a 20 20 20 20 20 20  indicated.      
1a720 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1a730 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1a740 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1a750 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1a760 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
1a770 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1a780 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   & SQLITE_INDEX_
1a790 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20  SCAN_UNIQUE ){. 
1a7a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1a7b0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
1a7c0 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EROW;.      }els
1a7d0 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
1a7e0 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1a7f0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
1a800 20 7d 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f   }.      whereLo
1a810 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a820 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a830 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
1a840 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
1a850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a860 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
1a870 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
1a880 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1a890 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
1a8a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
1a8b0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
1a8c0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
1a8d0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a8e0 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
1a8f0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
1a900 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
1a910 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1a920 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
1a930 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1a940 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1a950 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
1a960 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
1a970 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
1a980 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
1a990 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
1a9a0 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
1a9b0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1a9c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1a9d0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1a9e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1a9f0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a  der *pBuilder, .
1aa00 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
1aa10 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  , .  Bitmask mUn
1aa20 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72  usable.){.  Wher
1aa30 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1aa40 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1aa50 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1aa60 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
1aa70 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
1aa80 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
1aa90 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
1aaa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1aab0 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
1aac0 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
1aad0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1aae0 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
1aaf0 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
1ab00 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
1ab10 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1ab20 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
1ab30 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1ab40 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1ab50 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
1ab60 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1ab70 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
1ab80 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
1ab90 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
1aba0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1abb0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
1abc0 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
1abd0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
1abe0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1abf0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
1ac00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1ac10 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
1ac20 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1ac30 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
1ac40 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1ac50 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
1ac60 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
1ac70 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
1ac80 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
1ac90 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
1aca0 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
1acb0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1acc0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
1acd0 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
1ace0 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
1acf0 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
1ad00 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1ad10 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
1ad20 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
1ad30 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
1ad40 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
1ad50 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
1ad60 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
1ad70 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
1ad80 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
1ad90 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
1ada0 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1adb0 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
1adc0 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1add0 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1ade0 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
1adf0 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
1ae00 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
1ae10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1ae20 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
1ae30 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
1ae40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ae50 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1ae60 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
1ae70 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1ae80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
1ae90 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1aea0 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
1aeb0 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
1aec0 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
1aed0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1aee0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
1aef0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1af00 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
1af10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
1af20 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1af30 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
1af40 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
1af50 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1af60 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
1af70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1af80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1af90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1afa0 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
1afb0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1afc0 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
1afd0 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1afe0 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
1aff0 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
1b000 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
1b010 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1b020 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
1b030 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
1b040 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
1b050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1b060 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1b070 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
1b080 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b090 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  <sSubBuild.pWC->
1b0a0 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
1b0b0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65           whereTe
1b0c0 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69  rmPrint(&sSubBui
1b0d0 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29  ld.pWC->a[i], i)
1b0e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b0f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
1b100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b110 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1b120 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
1b130 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1b140 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
1b150 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b160 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
1b170 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e  ild, mExtra, mUn
1b180 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1b190 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1b1a0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b1b0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b1c0 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1b1d0 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
1b1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b1f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1b210 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1b220 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1b230 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65  Extra, mUnusable
1b240 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b250 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1b260 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
1b270 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
1b280 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
1b290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1b2a0 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1b2b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b2c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
1b2d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
1b2e0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
1b2f0 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
1b300 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1b310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b320 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
1b330 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
1b340 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1b350 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
1b360 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1b370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
1b380 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
1b390 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1b3a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b3b0 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1b3d0 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
1b3e0 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
1b3f0 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
1b400 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1b430 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
1b440 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
1b450 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1b480 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
1b490 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
1b4a0 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
1b4b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1b4c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b4d0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
1b4e0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1b4f0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
1b500 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
1b510 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1b520 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
1b530 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
1b540 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
1b550 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
1b560 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1b570 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
1b580 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
1b590 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1b5a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
1b5b0 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
1b5c0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1b5d0 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
1b5e0 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
1b5f0 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
1b600 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
1b610 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
1b620 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
1b630 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
1b640 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
1b650 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
1b660 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
1b670 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
1b680 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
1b690 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
1b6a0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
1b6b0 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
1b6c0 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
1b6d0 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
1b6e0 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
1b6f0 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
1b700 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
1b710 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
1b720 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
1b730 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
1b740 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
1b750 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
1b760 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
1b770 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
1b780 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
1b790 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
1b7a0 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
1b7b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1b7c0 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
1b7d0 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
1b7e0 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
1b7f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1b800 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
1b810 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
1b820 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
1b830 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
1b840 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1b850 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
1b860 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
1b870 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
1b880 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1b890 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
1b8a0 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
1b8b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
1b8c0 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
1b8d0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1b8e0 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
1b8f0 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
1b900 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1b910 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1b920 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1b930 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1b940 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
1b950 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1b960 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1b970 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1b990 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1b9a0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
1b9b0 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
1b9c0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1b9d0 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
1b9e0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1b9f0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
1ba00 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1ba10 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
1ba20 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
1ba30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1ba40 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1ba50 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1ba60 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1ba70 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1ba80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ba90 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1baa0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bab0 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1bac0 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1bad0 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1bae0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1baf0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1bb00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bb10 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1bb20 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1bb30 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1bb40 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1bb50 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1bb60 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1bb70 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1bb80 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1bb90 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1bba0 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1bbb0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1bbc0 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1bbd0 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1bbe0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1bbf0 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1bc00 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1bc10 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1bc20 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1bc30 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1bc40 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1bc50 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1bc60 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1bc70 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1bc80 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1bc90 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1bca0 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1bcb0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1bcc0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1bcd0 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1bce0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1bcf0 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1bd00 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1bd10 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1bd20 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1bd30 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50       mExtra = mP
1bd40 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
1bd50 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1bd60 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
1bd70 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
1bd80 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1bd90 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  b) ){.      stru
1bda0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bdb0 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
1bdc0 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e  &pItem[1]; p<pEn
1bdd0 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
1bde0 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c   if( mUnusable |
1bdf0 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  | (p->fg.jointyp
1be00 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1be10 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20  CROSS)) ){.     
1be20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c       mUnusable |
1be30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1be40 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1be50 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72  MaskSet, p->iCur
1be60 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sor);.        }.
1be70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1be80 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1be90 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
1bea0 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62   mExtra, mUnusab
1beb0 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
1bec0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1bed0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
1bee0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
1bef0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1bf00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bf10 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1bf20 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
1bf30 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73  r, mExtra, mUnus
1bf40 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1bf50 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1bf60 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1bf70 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1bf80 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1bf90 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1bfa0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1bfb0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1bfc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1bfd0 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1bfe0 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1bff0 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1c000 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
1c010 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1c020 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1c030 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1c040 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1c050 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1c060 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1c070 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1c080 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1c090 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1c0a0 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1c0b0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1c0c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1c0d0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1c0e0 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1c0f0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c100 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1c110 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1c120 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1c130 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1c140 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1c150 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1c160 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1c170 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1c180 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1c190 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c1a0 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1c1b0 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1c1c0 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c1d0 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1c1e0 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1c1f0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1c200 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1c210 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1c220 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1c230 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1c240 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1c250 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1c260 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1c270 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1c280 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1c290 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1c2a0 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1c2b0 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1c2c0 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c2d0 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1c2e0 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1c2f0 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1c300 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1c310 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1c320 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1c330 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1c340 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1c350 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1c360 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1c370 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1c380 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1c390 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1c3a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c3b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c3c0 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1c3d0 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1c3e0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1c3f0 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1c400 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1c410 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1c420 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1c430 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1c440 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1c450 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
1c460 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
1c470 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c480 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
1c490 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1c4a0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1c4b0 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
1c4c0 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
1c4d0 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
1c4e0 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
1c4f0 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
1c500 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
1c510 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
1c520 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
1c530 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
1c540 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
1c550 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1c560 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
1c570 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1c580 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
1c590 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
1c5a0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1c5b0 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
1c5c0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1c5d0 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
1c5e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
1c5f0 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1c600 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
1c610 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
1c620 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
1c630 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
1c640 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
1c650 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
1c660 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
1c670 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
1c680 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
1c690 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
1c6a0 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
1c6b0 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
1c6c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c6d0 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
1c6e0 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
1c6f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
1c700 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
1c710 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
1c720 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1c730 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c740 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
1c750 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1c760 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
1c770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c780 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
1c790 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c7a0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1c7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c7c0 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
1c7d0 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
1c7e0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
1c7f0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1c800 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c810 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1c820 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1c830 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1c840 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
1c850 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
1c860 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1c870 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
1c880 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
1c890 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
1c8a0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1c8b0 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
1c8c0 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
1c8d0 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
1c8e0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1c8f0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1c900 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1c910 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1c920 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
1c930 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
1c940 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
1c950 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c960 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1c970 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
1c980 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
1c990 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
1c9a0 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
1c9b0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1c9c0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1c9d0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1c9e0 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
1c9f0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1ca00 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
1ca10 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1ca20 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
1ca30 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
1ca40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
1ca50 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1ca60 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
1ca70 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
1ca80 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
1ca90 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
1caa0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
1cab0 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
1cac0 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
1cad0 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
1cae0 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
1caf0 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
1cb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1cb10 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
1cb20 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
1cb30 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1cb40 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
1cb50 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
1cb60 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1cb70 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
1cb80 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
1cb90 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
1cba0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1cbb0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1cbc0 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
1cbd0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
1cbe0 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
1cbf0 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
1cc00 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
1cc10 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
1cc20 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
1cc30 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1cc40 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
1cc50 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
1cc60 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
1cc70 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1cc80 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
1cc90 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
1cca0 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
1ccb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
1ccc0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1ccd0 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
1cce0 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
1ccf0 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
1cd00 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
1cd10 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
1cd20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cd30 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
1cd40 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
1cd50 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
1cd60 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
1cd70 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
1cd80 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
1cd90 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
1cda0 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
1cdb0 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
1cdc0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
1cdd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1cde0 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
1cdf0 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
1ce00 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
1ce10 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
1ce20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
1ce30 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
1ce40 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
1ce50 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
1ce60 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1ce70 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
1ce80 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
1ce90 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
1cea0 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
1ceb0 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
1cec0 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
1ced0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
1cee0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
1cef0 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
1cf00 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
1cf10 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
1cf20 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
1cf30 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
1cf40 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
1cf50 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
1cf60 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
1cf70 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1cf80 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
1cf90 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
1cfa0 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
1cfb0 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
1cfc0 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
1cfd0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1cfe0 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
1cff0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
1d000 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1d010 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1d020 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
1d030 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1d040 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1d050 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
1d060 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
1d070 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
1d080 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
1d090 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
1d0a0 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
1d0b0 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
1d0c0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1d0d0 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
1d0e0 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
1d0f0 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
1d100 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
1d110 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
1d120 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
1d130 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
1d140 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
1d150 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
1d160 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
1d170 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
1d180 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1d190 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
1d1a0 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
1d1b0 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
1d1c0 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
1d1d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d1e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d1f0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1d200 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
1d210 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
1d220 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
1d230 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d240 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
1d250 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
1d260 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
1d270 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
1d280 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
1d290 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
1d2a0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1d2b0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
1d2c0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
1d2d0 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
1d2e0 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
1d2f0 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
1d300 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
1d310 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
1d320 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
1d330 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
1d340 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
1d350 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1d360 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1d370 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1d380 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1d390 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
1d3a0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d3b0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1d3c0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1d3d0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
1d3e0 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1d3f0 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1d400 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1d410 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1d420 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d430 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
1d440 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
1d450 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
1d460 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
1d470 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
1d490 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
1d4a0 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
1d4b0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1d4c0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d4d0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1d4e0 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
1d4f0 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
1d500 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1d510 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1d520 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
1d530 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
1d540 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d550 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1d560 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1d570 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1d580 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1d590 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1d5a0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d5b0 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
1d5c0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
1d5d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1d5e0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1d5f0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1d600 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1d610 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1d620 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1d630 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
1d640 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1d650 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d660 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1d670 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1d680 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d690 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
1d6a0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1d6b0 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
1d6c0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1d6d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
1d6e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d6f0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
1d700 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1d710 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d720 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
1d730 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1d740 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1d750 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
1d760 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
1d770 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
1d780 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1d790 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
1d7a0 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
1d7b0 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
1d7c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1d7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
1d7e0 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
1d7f0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
1d800 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
1d810 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
1d820 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
1d830 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
1d840 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d850 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
1d860 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d870 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1d880 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
1d890 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d8c0 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
1d8d0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1d8e0 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
1d8f0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
1d900 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d910 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
1d920 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
1d930 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
1d940 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
1d950 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
1d960 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
1d970 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
1d980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
1d990 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
1d9a0 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
1d9b0 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
1d9c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
1d9d0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1d9e0 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
1d9f0 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
1da00 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
1da10 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
1da20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
1da30 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
1da40 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
1da50 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
1da60 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
1da70 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70   && pLoop->nSkip
1da80 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1da90 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ((i = pLoop->aLT
1daa0 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
1dab0 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  r) & (WO_EQ|WO_I
1dac0 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30  SNULL|WO_IS))!=0
1dad0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1dae0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
1daf0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1db00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1db10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1db20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1db30 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1db40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1db50 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1db60 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
1db70 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
1db80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1db90 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
1dba0 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
1dbb0 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
1dbc0 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
1dbd0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1dbe0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
1dbf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dc00 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1dc10 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
1dc20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1dc30 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1dc40 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
1dc50 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
1dc60 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1dc70 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
1dc80 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
1dc90 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
1dca0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dcb0 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
1dcc0 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1dcd0 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1dce0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1dcf0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1dd00 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1dd10 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1dd20 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1dd30 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1dd40 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1dd50 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1dd60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dd70 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1dd80 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1dd90 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1dda0 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1ddb0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1ddc0 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1ddd0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1dde0 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1ddf0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1de00 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1de10 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1de20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1de30 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1de40 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1de50 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1de60 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1de70 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1de80 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1de90 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1dea0 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1deb0 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1dec0 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1ded0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1dee0 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1def0 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1df00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1df10 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1df20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1df30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1df40 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1df50 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1df60 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1df70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1df80 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1df90 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1dfa0 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1dfb0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1dfc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1dfd0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1dfe0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1dff0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1e000 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1e010 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1e020 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1e030 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
1e040 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
1e050 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1e060 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1e070 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e080 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1e090 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1e0a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e0b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1e0c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1e0d0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1e0e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
1e0f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e100 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1e110 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
1e120 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
1e130 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
1e140 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1e150 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1e160 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e180 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
1e190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e1a0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1e1b0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1e1c0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1e1d0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1e1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e1f0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1e200 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1e210 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e220 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e230 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
1e240 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
1e250 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1e260 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e270 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1e280 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1e290 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1e2a0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1e2b0 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
1e2c0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1e2d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e2e0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1e2f0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
1e300 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
1e310 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1e320 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
1e330 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
1e340 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
1e350 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1e360 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1e370 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
1e380 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
1e390 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
1e3a0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1e3b0 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
1e3c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1e3d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e3e0 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
1e3f0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1e400 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
1e410 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
1e420 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
1e430 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
1e440 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
1e450 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1e460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e470 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
1e480 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e490 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1e4a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e4b0 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
1e4c0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
1e4d0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
1e4e0 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
1e4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
1e500 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1e510 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
1e520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e530 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
1e540 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1e550 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
1e560 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1e570 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1e580 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
1e590 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1e5a0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1e5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e5c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e5e0 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
1e5f0 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
1e600 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
1e610 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1e620 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e630 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1e640 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
1e650 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1e660 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
1e670 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
1e680 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
1e690 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
1e6a0 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
1e6b0 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
1e6c0 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
1e6d0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
1e6e0 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1e6f0 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
1e700 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
1e710 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
1e720 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1e730 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1e740 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
1e750 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
1e760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
1e770 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1e780 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e790 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
1e7a0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
1e7b0 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
1e7c0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
1e7d0 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
1e7e0 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
1e7f0 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
1e800 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
1e810 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
1e820 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e830 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
1e840 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
1e850 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e860 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1e870 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1e880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e890 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
1e8a0 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
1e8b0 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
1e8c0 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
1e8d0 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
1e8e0 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
1e8f0 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
1e900 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
1e910 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1e920 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
1e930 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
1e940 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1e950 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
1e960 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
1e970 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
1e980 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
1e990 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e9a0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
1e9b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
1e9c0 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
1e9d0 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
1e9e0 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
1e9f0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1ea00 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
1ea10 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1ea20 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
1ea30 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
1ea40 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
1ea50 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
1ea60 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
1ea70 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
1ea80 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
1ea90 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
1eaa0 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
1eab0 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
1eac0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1ead0 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
1eae0 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
1eaf0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
1eb00 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
1eb10 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
1eb20 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
1eb30 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
1eb40 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
1eb50 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
1eb60 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
1eb70 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
1eb80 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
1eb90 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
1eba0 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
1ebb0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1ebc0 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
1ebd0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1ebe0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
1ebf0 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1ec00 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
1ec10 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
1ec20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
1ec30 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
1ec40 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
1ec50 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
1ec60 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
1ec70 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
1ec80 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
1ec90 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1eca0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1ecb0 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
1ecc0 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
1ecd0 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
1ece0 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
1ecf0 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
1ed00 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
1ed10 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1ed20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
1ed30 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
1ed40 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
1ed50 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
1ed60 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
1ed70 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1ed80 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ed90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1eda0 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
1edb0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1edc0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1edd0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
1ede0 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
1edf0 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
1ee00 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1ee10 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
1ee20 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
1ee30 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
1ee40 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
1ee50 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
1ee60 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
1ee70 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
1ee80 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
1ee90 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
1eea0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1eeb0 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
1eec0 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
1eed0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
1eee0 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
1eef0 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
1ef00 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
1ef10 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
1ef20 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
1ef30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1ef40 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
1ef50 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
1ef60 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
1ef70 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
1ef80 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
1ef90 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
1efa0 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
1efb0 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
1efc0 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
1efd0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
1efe0 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
1eff0 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1f000 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
1f010 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
1f020 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
1f030 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
1f040 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
1f050 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
1f060 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
1f070 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
1f080 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1f090 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
1f0a0 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
1f0b0 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
1f0c0 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
1f0d0 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
1f0e0 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
1f0f0 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
1f100 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
1f110 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
1f120 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
1f130 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
1f140 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
1f150 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
1f160 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
1f170 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
1f180 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
1f190 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
1f1a0 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
1f1b0 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
1f1c0 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
1f1d0 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
1f1e0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
1f1f0 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
1f200 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1f210 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
1f220 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
1f230 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
1f240 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
1f250 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
1f260 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
1f270 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
1f280 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52  nRow + estLog(nR
1f290 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  ow) + rScale + 1
1f2a0 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  6;..  /* TUNING:
1f2b0 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70   The cost of imp
1f2c0 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e  lementing DISTIN
1f2d0 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45  CT using a B-TRE
1f2e0 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61  E is.  ** simila
1f2f0 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61 72  r but with a lar
1f300 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20  ger constant of 
1f310 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e  proportionality.
1f320 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20   .  ** Multiply 
1f330 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
1f340 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20   factor of 3.0. 
1f350 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
1f360 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1f370 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
1f380 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74 43  CT ){.    rSortC
1f390 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a  ost += 16;.  }..
1f3a0 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
1f3b0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
1f3c0 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
1f3d0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1f3e0 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
1f3f0 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
1f400 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
1f410 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
1f420 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
1f430 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
1f440 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
1f450 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
1f460 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
1f470 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
1f480 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
1f490 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
1f4a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1f4b0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
1f4c0 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
1f4d0 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
1f4e0 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
1f4f0 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
1f500 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
1f510 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
1f520 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
1f530 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
1f540 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f550 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
1f560 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
1f570 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f580 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
1f590 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f5a0 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
1f5b0 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
1f5c0 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
1f5d0 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
1f5e0 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
1f5f0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
1f600 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
1f610 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
1f620 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
1f630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f640 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1f650 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
1f660 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1f670 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
1f680 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1f690 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
1f6a0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1f6b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f6c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f6d0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
1f6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f6f0 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
1f700 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1f710 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
1f720 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
1f730 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f740 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
1f750 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
1f760 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f770 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
1f780 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
1f790 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1f7a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f7b0 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
1f7c0 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
1f7d0 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
1f7e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1f7f0 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
1f800 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
1f810 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
1f820 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
1f830 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
1f840 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
1f850 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
1f860 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
1f870 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1f880 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
1f890 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
1f8a0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
1f8b0 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
1f8c0 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
1f8d0 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
1f8e0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
1f8f0 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
1f900 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f910 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
1f920 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
1f930 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
1f940 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
1f950 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
1f960 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
1f970 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1f980 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
1f990 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
1f9a0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
1f9b0 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
1f9c0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1f9d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f9e0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
1f9f0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
1fa00 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
1fa10 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
1fa20 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
1fa30 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
1fa40 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
1fa50 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
1fa60 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
1fa70 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
1fa80 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
1fa90 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
1faa0 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
1fab0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1fac0 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
1fad0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
1fae0 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb00 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
1fb10 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
1fb20 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
1fb30 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1fb40 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
1fb50 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
1fb60 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
1fb70 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
1fb80 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
1fb90 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
1fba0 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
1fbb0 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
1fbc0 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
1fbd0 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
1fbe0 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
1fbf0 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
1fc00 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
1fc10 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
1fc20 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
1fc30 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
1fc40 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
1fc50 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
1fc60 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
1fc70 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
1fc80 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
1fc90 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
1fca0 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
1fcb0 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
1fcc0 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
1fcd0 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
1fce0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1fcf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fd00 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
1fd10 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
1fd20 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
1fd30 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
1fd40 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
1fd50 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1fd60 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
1fd70 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
1fd80 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
1fd90 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1fda0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
1fdb0 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
1fdc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
1fdd0 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
1fde0 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
1fdf0 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
1fe00 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
1fe10 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
1fe20 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
1fe30 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
1fe40 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
1fe50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fe60 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
1fe70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1fe80 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
1fe90 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1fea0 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
1feb0 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
1fec0 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
1fed0 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
1fee0 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
1fef0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
1ff00 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
1ff10 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
1ff20 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
1ff30 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
1ff40 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ff50 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63 65  ocRaw(db, nSpace
1ff60 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
1ff70 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1ff80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
1ff90 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
1ffa0 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
1ffb0 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
1ffc0 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
1ffd0 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
1ffe0 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
1fff0 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
20000 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
20010 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
20020 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
20030 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
20040 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
20050 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
20060 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  pX;.  }.  if( nO
20070 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
20080 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
20090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
200a0 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65  and it is not be
200b0 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74  ing ignored, set
200c0 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65   up.    ** space
200d0 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f   for the aSortCo
200e0 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68  st[] array. Each
200f0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
20100 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a  aSortCost array.
20110 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
20120 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20   zero - meaning 
20130 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
20140 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
20150 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  - or the.    ** 
20160 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
20170 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20  nRowEst rows of 
20180 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66  data where the f
20190 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a  irst X terms of.
201a0 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
201b0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61   BY clause are a
201c0 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c  lready in order,
201d0 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20   where X is the 
201e0 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e  array .    ** in
201f0 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f  dex.  */.    aSo
20200 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74  rtCost = (LogEst
20210 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74  *)pX;.    memset
20220 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73  (aSortCost, 0, s
20230 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
20240 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  nOrderBy);.  }. 
20250 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
20260 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st==0 || &pSpace
20270 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
20280 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64  )&aSortCost[nOrd
20290 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72  erBy] );.  asser
202a0 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20  t( aSortCost!=0 
202b0 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
202c0 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b  e]==(char*)pX );
202d0 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
202e0 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
202f0 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
20300 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
20310 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
20320 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
20330 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
20340 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
20350 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49   go above 28.  I
20360 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
20370 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
20380 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
20390 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
203a0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
203b0 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 28.  ** rows, 
203c0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
203d0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
203e0 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
203f0 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
20400 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
20410 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20  , 48);  assert( 
20420 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  48==sqlite3LogEs
20430 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(28) );.  nFrom
20440 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
20450 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
20460 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ed==0 );.  if( n
20470 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
20480 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65  * If nLoop is ze
20490 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ro, then there a
204a0 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73  re no FROM terms
204b0 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53   in the query. S
204c0 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ince.    ** in t
204d0 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65  his case the que
204e0 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20  ry may return a 
204f0 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72  maximum of one r
20500 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ow, the results.
20510 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
20520 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  dy in the reques
20530 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69  ted order. Set i
20540 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64  sOrdered to nOrd
20550 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69  erBy to.    ** i
20560 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72  ndicate this. Or
20570 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72  , if nLoop is gr
20580 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
20590 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   set isOrdered t
205a0 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64  o.    ** -1, ind
205b0 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
205c0 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20   result set may 
205d0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72  or may not be or
205e0 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64  dered, .    ** d
205f0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
20600 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74  loops added to t
20610 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e  he current plan.
20620 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30    */.    aFrom[0
20630 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
20640 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72  oop>0 ? -1 : nOr
20650 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
20660 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
20670 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
20680 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
20690 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
206a0 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
206b0 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
206c0 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
206d0 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
206e0 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
206f0 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
20700 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
20710 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
20720 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
20730 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
20740 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
20750 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
20760 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
20770 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
20780 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
20790 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
207a0 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
207b0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
207c0 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
207d0 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20   nOut;          
207e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
207f0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28  ows visited by (
20800 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
20810 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
20820 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  rCost;          
20830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
20840 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f  st of path (pFro
20850 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
20860 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73       LogEst rUns
20870 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  orted;          
20880 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
20890 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f  ed cost of (pFro
208a0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
208b0 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65       i8 isOrdere
208c0 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
208d0 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65  ered;  /* isOrde
208e0 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70  red for (pFrom+p
208f0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
20900 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
20910 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
20920 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
20930 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e  rc visited by (.
20940 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  .) */.        Bi
20950 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
20960 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20970 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f  /* Mask of rev-o
20980 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28  rder loops for (
20990 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ..) */..        
209a0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
209b0 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
209c0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
209d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
209e0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
209f0 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
20a00 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
20a10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
20a20 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
20a30 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
20a40 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
20a50 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
20a60 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
20a70 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
20a80 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
20a90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
20aa0 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
20ab0 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
20ac0 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
20ad0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
20ae0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
20af0 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
20b00 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
20b10 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
20b20 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
20b30 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
20b40 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
20b50 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
20b60 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
20b70 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
20b80 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
20b90 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
20ba0 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
20bb0 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
20bc0 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
20bd0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20be0 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
20bf0 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
20c00 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20c20 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
20c30 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
20c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20c50 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
20c60 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
20c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20c80 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
20c90 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
20ca0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
20cb0 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
20cc0 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
20cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
20ce0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20cf0 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
20d00 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
20d10 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
20d20 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
20d30 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
20d40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20d60 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
20d70 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
20d80 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
20d90 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
20da0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
20db0 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
20dc0 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
20dd0 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
20de0 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
20df0 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
20e00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20e10 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
20e20 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
20e30 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
20e40 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
20e50 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
20e60 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
20e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20e80 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
20e90 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
20ea0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
20eb0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
20ec0 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
20ed0 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
20ee0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
20ef0 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
20f00 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
20f10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20f20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
20f30 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
20f40 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
20f50 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
20f60 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
20f70 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
20f80 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
20f90 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
20fa0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
20fb0 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
20fc0 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
20fd0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
20fe0 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
20ff0 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
21000 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
21010 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
21020 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
21030 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
21040 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
21050 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
21060 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
21070 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
21080 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
21090 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
210a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
210b0 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
210c0 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
210d0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
210e0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
210f0 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
21100 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
21110 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
21120 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
21130 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
21140 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21150 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
21160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
21170 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
21180 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21190 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
211a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
211b0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
211c0 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
211d0 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
211e0 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
211f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
21200 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
21210 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
21220 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
21230 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
21240 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
21250 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
21260 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
21270 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
21280 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
21290 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
212a0 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
212b0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
212c0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
212d0 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
212e0 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
212f0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
21300 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
21310 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
21320 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
21330 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
21340 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
21350 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
21360 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21380 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21390 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
213a0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
213b0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
213c0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
213d0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
213e0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
213f0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
21400 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
21410 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
21420 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
21430 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
21440 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
21450 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
21460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21470 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
21480 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
21490 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
214a0 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
214b0 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
214c0 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
214d0 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
214e0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
214f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
21500 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
21510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
21520 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
21530 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
21540 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
21550 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
21560 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
21570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21580 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
21590 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
215a0 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
215b0 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
215c0 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
215d0 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
215e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
215f0 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
21600 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
21610 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
21620 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
21630 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
21640 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
21650 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21660 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
21670 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
21680 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
21690 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
216a0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
216b0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
216c0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
216d0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
216e0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
216f0 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
21700 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
21710 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21720 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21730 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
21740 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
21750 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
21760 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f  h pTo=aTo[jj] co
21770 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20  vers the.       
21780 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f     ** same set o
21790 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
217a0 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65  the sam isOrdere
217b0 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
217c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
217d0 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
217e0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
217f0 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
21800 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
21810 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
21820 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
21830 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
21840 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
21850 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
21860 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
21870 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54  ost==rCost && pT
21880 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29  o->nRow<=nOut) )
21890 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
218a0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
218b0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
218c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
218d0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
218f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21910 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
21920 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
21930 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
21940 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
21950 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
21960 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
21970 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21990 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
219a0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
219b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
219c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
219d0 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
219e0 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
219f0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
21a00 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
21a10 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
21a20 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
21a30 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
21a60 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
21a70 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
21a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
21a90 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
21aa0 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
21ab0 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
21ac0 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
21ad0 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
21ae0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21af0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
21b00 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
21b10 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21b20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21b30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b40 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
21b50 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
21b60 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
21b70 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
21b80 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
21b90 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
21ba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
21bb0 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
21bc0 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
21bd0 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
21be0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
21bf0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
21c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21c10 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
21c20 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
21c30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21c40 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
21c50 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
21c60 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21c70 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21c80 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
21c90 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
21ca0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
21cb0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21cd0 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21ce0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21d00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21d10 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
21d20 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21d30 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21d40 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21d50 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21d60 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21d70 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
21d90 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
21da0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
21db0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
21dc0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21dd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21de0 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
21df0 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
21e00 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
21e10 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
21e20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
21e30 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
21e40 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
21e50 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
21e60 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
21e70 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
21e80 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
21e90 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
21ea0 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
21eb0 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
21ec0 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
21ed0 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
21ee0 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
21ef0 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
21f00 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
21f10 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
21f20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
21f30 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
21f40 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
21f50 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
21f60 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
21f70 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
21f80 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
21f90 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
21fa0 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
21fb0 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
21fc0 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
21fd0 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
21fe0 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
21ff0 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
22000 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
22010 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22020 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
22030 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
22040 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
22050 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
22060 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
22070 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
22080 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22090 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
220a0 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
220b0 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
220c0 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
220d0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
220e0 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
220f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
22120 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
22130 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
22140 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
22150 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
22160 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
22170 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22180 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
22190 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
221a0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
221b0 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
221c0 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
221d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
221e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
221f0 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
22200 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
22210 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
22220 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
22230 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
22240 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
22250 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
22260 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
22270 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
22280 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
22290 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
222a0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
222b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
222c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
222d0 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
222e0 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
222f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
22310 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
22320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22330 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
22340 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
22350 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
22360 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
22370 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
22380 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
22390 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
223a0 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
223b0 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
223c0 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
223d0 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
223e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
223f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
22400 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
22410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
22420 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
22430 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22440 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
22450 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
22460 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
22470 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
22480 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
22490 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
224a0 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
224b0 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
224c0 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
224d0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
224e0 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
224f0 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
22500 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
22510 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
22520 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
22530 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
22540 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
22550 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
22560 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
22570 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
22580 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
22590 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
225a0 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
225b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
225c0 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
225d0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
225e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
225f0 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
22600 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
22610 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
22620 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
22630 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
22640 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
22650 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
22660 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
22670 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
22680 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
22690 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
226a0 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
226b0 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
226c0 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
226d0 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
226e0 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
226f0 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
22700 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
22710 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
22720 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
22730 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
22740 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
22760 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
22770 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
22780 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
22790 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
227a0 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
227b0 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
227c0 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
227d0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
227e0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
227f0 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
22800 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
22810 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
22820 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
22830 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
22840 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
22850 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
22860 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
22870 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
22880 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
22890 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
228a0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
228b0 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
228c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
228d0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
228e0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
228f0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
22900 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20  nfo->nOBSat<0 ) 
22910 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
22920 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   0;.      pWInfo
22930 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
22940 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
22950 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
22960 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22970 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
22980 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
22990 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
229a0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
229b0 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
229c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
229d0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
229e0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
229f0 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
22a00 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
22a10 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
22a20 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
22a30 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
22a40 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
22a50 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
22a60 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
22a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22a80 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
22a90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
22aa0 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
22ab0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
22ac0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
22ad0 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
22ae0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
22af0 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
22b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22b10 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
22b20 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
22b30 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
22b40 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
22b50 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
22b60 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
22b70 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
22b80 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
22b90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22ba0 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
22bb0 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
22bc0 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
22bd0 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
22be0 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
22bf0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
22c00 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
22c10 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
22c20 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
22c30 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
22c40 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
22c50 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
22c60 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
22c70 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
22c80 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
22c90 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
22ca0 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
22cb0 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
22cc0 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
22cd0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
22ce0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
22cf0 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
22d00 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
22d10 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
22d20 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
22d30 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
22d40 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
22d50 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
22d60 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
22d70 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
22d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22d90 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
22da0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
22db0 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
22dc0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
22dd0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22de0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22df0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
22e00 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
22e10 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
22e20 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
22e30 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
22e40 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22e50 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
22e60 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
22e70 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
22e80 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
22e90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
22ea0 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
22eb0 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
22ec0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22ed0 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
22ee0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
22ef0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
22f00 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
22f10 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
22f20 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
22f30 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
22f40 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
22f50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
22f60 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
22f70 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
22f80 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
22f90 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
22fa0 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
22fb0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
22fc0 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
22fd0 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
22fe0 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
22ff0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
23000 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
23010 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
23020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
23030 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
23040 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
23050 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
23060 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
23070 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
23080 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
23090 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
230a0 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
230b0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
230c0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
230d0 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
230e0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
230f0 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
23100 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
23110 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
23120 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
23130 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
23140 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
23150 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
23160 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
23170 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
23180 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
23190 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
231a0 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
231b0 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
231c0 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
231d0 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
231e0 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
231f0 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
23200 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
23210 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
23220 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
23230 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
23240 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
23250 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
23260 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
23270 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
23280 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
23290 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
232a0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
232b0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
232c0 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
232d0 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
232e0 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
232f0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
23300 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
23310 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
23320 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
23330 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
23340 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
23350 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
23360 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
23370 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
23380 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
23390 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
233a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
233b0 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
233c0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
233d0 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
233e0 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
233f0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
23400 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
23410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23420 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
23430 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
23440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23450 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
23460 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
23470 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
23480 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
23490 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
234a0 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
234b0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
234c0 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
234d0 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
234e0 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
234f0 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
23500 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
23510 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
23520 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
23530 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
23540 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
23550 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
23560 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
23570 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
23580 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
23590 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lf = sqlite3Wher
235a0 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
235b0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
235c0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
235d0 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
235e0 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
235f0 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
23600 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
23610 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
23620 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
23630 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
23640 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
23650 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
23660 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
23670 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
23680 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
23690 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
236a0 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
236b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
236c0 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
236d0 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
236e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
236f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23700 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
23710 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
23720 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
23730 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
23740 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
23750 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
23760 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
23770 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
23780 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
23790 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
237a0 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
237b0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
237c0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
237d0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
237e0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
237f0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
23800 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
23810 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
23820 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
23830 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
23840 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
23850 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
23860 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23870 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
23880 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
23890 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
238a0 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
238b0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
238c0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
238d0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
238e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
238f0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
23900 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
23910 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
23920 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
23930 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
23940 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
23950 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
23960 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
23970 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
23980 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
23990 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
239a0 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
239b0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
239c0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
239d0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
239e0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
239f0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
23a00 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
23a10 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
23a20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23a30 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
23a40 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
23a50 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23a60 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23a70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
23a80 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
23a90 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
23aa0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
23ab0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
23ad0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23ae0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23b10 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
23b20 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
23b50 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
23b60 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
23b70 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
23b80 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
23b90 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
23ba0 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
23bb0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
23bc0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
23bd0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
23be0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
23bf0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
23c00 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
23c10 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
23c20 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
23c30 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
23c40 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
23c50 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
23c60 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
23c70 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
23c80 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
23c90 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
23ca0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
23cb0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
23cc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
23cd0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
23ce0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
23cf0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
23d00 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
23d10 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
23d20 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
23d30 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
23d40 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
23d50 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
23d60 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
23d70 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
23d80 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
23d90 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
23da0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
23db0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
23dc0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
23dd0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23de0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
23df0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
23e00 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
23e10 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
23e20 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
23e30 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
23e40 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
23e50 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
23e60 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
23e70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
23e80 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
23e90 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
23ea0 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
23eb0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
23ec0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
23ed0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
23ee0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
23ef0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
23f00 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
23f10 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
23f20 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
23f30 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
23f40 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
23f50 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
23f60 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
23f70 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
23f80 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
23f90 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
23fa0 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
23fb0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
23fc0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
23fd0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
23fe0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
23ff0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
24000 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
24010 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
24020 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
24030 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
24040 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
24050 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
24060 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
24070 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
24080 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
24090 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
240a0 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
240b0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
240c0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
240d0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
240e0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
240f0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
24100 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
24110 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
24120 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
24130 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
24140 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
24150 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
24160 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
24170 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
24180 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
24190 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
241a0 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
241b0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
241c0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
241d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
241e0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
241f0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
24200 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
24210 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
24220 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
24230 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
24240 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
24250 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
24260 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
24270 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
24280 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
24290 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
242a0 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
242b0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
242c0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
242d0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
242e0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
242f0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
24300 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
24310 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
24320 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
24330 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
24340 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
24350 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
24360 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
24370 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
24380 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24390 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
243a0 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
243b0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
243c0 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
243d0 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
243e0 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
243f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24400 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
24410 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
24420 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
24430 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
24440 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
24450 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
24460 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
24470 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
24480 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
24490 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75  **.** The iIdxCu
244a0 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
244b0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
244c0 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49   of an index.  I
244d0 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  f .** WHERE_ONET
244e0 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
244f0 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65  , iIdxCur is the
24500 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
24510 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f  f an index.** to
24520 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75   use for OR clau
24530 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
24540 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24550 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73   should use this
24560 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72  .** specific cur
24570 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f  sor.  If WHERE_O
24580 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69  NEPASS_DESIRED i
24590 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78  s set, then iIdx
245a0 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  Cur is.** the fi
245b0 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e  rst cursor in an
245c0 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72   array of cursor
245d0 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
245e0 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75  s.  iIdxCur shou
245f0 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ld.** be used to
24600 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70   compute the app
24610 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20  ropriate cursor 
24620 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69  depending on whi
24630 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75  ch index is.** u
24640 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  sed..*/.WhereInf
24650 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
24660 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
24670 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
24680 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
24690 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
246a0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
246b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
246c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
246d0 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
246e0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
246f0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
24700 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24710 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
24720 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
24730 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
24740 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
24750 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
24760 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
24770 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
24780 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
24790 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
247a0 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
247b0 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
247c0 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
247d0 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
247e0 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
247f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
24800 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
24810 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
24820 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
24830 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
24840 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
24850 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
24860 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
24870 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
24880 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
248a0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
248b0 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
248c0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
248d0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
248e0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
248f0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
24900 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
24910 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
24920 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
24930 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
24940 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
24950 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
24960 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
24970 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
24980 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
24990 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
249a0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
249b0 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
249c0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
249d0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
249e0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
249f0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
24a00 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
24a10 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
24a20 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
24a30 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
24a40 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
24a50 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
24a60 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
24a70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
24a80 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
24a90 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
24ac0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
24ad0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
24ae0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24af0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
24b00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24b20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
24b30 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
24b40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46  ;         /* OPF
24b50 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72  LAG_FORDELETE or
24b60 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70   zero, as approp
24b70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65  riate */..  asse
24b80 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
24b90 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
24ba0 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20  MULTIROW)==0 || 
24bb0 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c  (.        (wctrl
24bc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
24bd0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
24be0 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72  0 .     && (wctr
24bf0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
24c00 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
24c10 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  =0 .  ));..  /* 
24c20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c  Variable initial
24c30 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20  ization */.  db 
24c40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24c50 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c  memset(&sWLB, 0,
24c60 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a   sizeof(sWLB));.
24c70 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47  .  /* An ORDER/G
24c80 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f  ROUP BY clause o
24c90 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74  f more than 63 t
24ca0 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f  erms cannot be o
24cb0 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65  ptimized */.  te
24cc0 73 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79  stcase( pOrderBy
24cd0 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
24ce0 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  xpr==BMS-1 );.  
24cf0 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
24d00 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
24d10 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20  =BMS ) pOrderBy 
24d20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64  = 0;.  sWLB.pOrd
24d30 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
24d40 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74  ..  /* Disable t
24d50 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69  he DISTINCT opti
24d60 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49  mization if SQLI
24d70 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69  TE_DistinctOpt i
24d80 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73  s set via.  ** s
24d90 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c  qlite3_test_ctrl
24da0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
24db0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e  _OPTIMIZATIONS,.
24dc0 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..) */.  if( Opt
24dd0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
24de0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73  d(db, SQLITE_Dis
24df0 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20  tinctOpt) ){.   
24e00 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e   wctrlFlags &= ~
24e10 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
24e20 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  NCT;.  }..  /* T
24e30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
24e40 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
24e50 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
24e60 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
24e70 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
24e80 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
24e90 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
24ea0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20  List->nSrc==BMS 
24eb0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  );.  if( pTabLis
24ec0 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
24ed0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24ee0 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
24ef0 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
24f00 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
24f10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
24f20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  }..  /* This fun
24f30 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67  ction normally g
24f40 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65  enerates a neste
24f50 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74  d loop for all t
24f60 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70  ables in .  ** p
24f70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66  TabList.  But if
24f80 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41   the WHERE_ONETA
24f90 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73  BLE_ONLY flag is
24fa0 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68   set, then we sh
24fb0 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67  ould.  ** only g
24fc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
24fd0 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
24fe0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64   in pTabList and
24ff0 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a   assume that.  *
25000 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73  * any cursors as
25010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75  sociated with su
25020 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20  bsequent tables 
25030 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  are uninitialize
25040 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69  d..  */.  nTabLi
25050 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73  st = (wctrlFlags
25060 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
25070 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54  E_ONLY) ? 1 : pT
25080 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20  abList->nSrc;.. 
25090 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
250a0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
250b0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
250c0 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
250d0 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65  come the.  ** re
250e0 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69  turn value. A si
250f0 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ngle allocation 
25100 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
25110 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20   the WhereInfo. 
25120 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20   ** struct, the 
25130 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72  contents of Wher
25140 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57  eInfo.a[], the W
25150 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
25160 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ture.  ** and th
25170 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
25180 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20  tructure. Since 
25190 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74  WhereClause cont
251a0 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20  ains an 8-byte. 
251b0 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20   ** field (type 
251c0 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74  Bitmask) it must
251d0 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61   be aligned on a
251e0 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
251f0 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61  y on.  ** some a
25200 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65  rchitectures. He
25210 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29  nce the ROUND8()
25220 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e   below..  */.  n
25230 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
25240 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
25250 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
25260 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
25270 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
25280 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
25290 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57  cZero(db, nByteW
252a0 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68  Info + sizeof(Wh
252b0 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28  ereLoop));.  if(
252c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
252d0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
252e0 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
252f0 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
25300 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
25310 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
25320 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  }.  pWInfo->aiCu
25330 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57  rOnePass[0] = pW
25340 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
25350 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57  ss[1] = -1;.  pW
25360 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
25370 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
25380 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
25390 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
253a0 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
253b0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t;.  pWInfo->pOr
253c0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
253d0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  ;.  pWInfo->pRes
253e0 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74  ultSet = pResult
253f0 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  Set;.  pWInfo->i
25400 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e  Break = pWInfo->
25410 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
25420 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25430 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  (v);.  pWInfo->w
25440 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
25450 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
25460 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
25470 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
25480 72 79 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74  ryLoop;.  assert
25490 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
254a0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
254b0 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64  );  /* ONEPASS d
254c0 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a  efaults to OFF *
254d0 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  /.  pMaskSet = &
254e0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
254f0 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
25500 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
25510 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
25520 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
25530 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
25540 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
25550 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
25560 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
25570 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
25580 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
25590 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
255a0 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
255b0 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
255c0 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
255d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
255e0 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
255f0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
25600 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
25610 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
25620 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
25630 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
25640 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
25650 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
25660 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
25670 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
25680 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
25690 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
256a0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
256b0 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
256c0 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
256d0 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
256e0 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
256f0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
25700 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
25710 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
25720 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
25730 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
25740 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
25750 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
25760 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
25770 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
25780 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
25790 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
257a0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
257b0 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
257c0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
257d0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
257e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
257f0 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
25800 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
25810 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
25840 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
25850 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
25860 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
25870 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
25880 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
25890 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
258a0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
258b0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
258c0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
258d0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
258e0 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
258f0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
25900 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
25910 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
25920 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
25930 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
25940 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
25950 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
25960 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
25970 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
25980 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
25990 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
259a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
259b0 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
259c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
259d0 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61  assigned a bitma
259e0 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a  sk of 1<<N..  **
259f0 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f  .  ** The rule o
25a00 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
25a10 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
25a20 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
25a30 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a   bitmask for.  *
25a40 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68 65  * a table T, the
25a50 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62 69 74  n X-1 is the bit
25a60 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68  mask for all oth
25a70 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  er tables to the
25a80 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a   left of T..  **
25a90 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
25aa0 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
25ab0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
25ac0 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
25ad0 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74  s.  ** important
25ae0 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
25af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
25b00 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
25b10 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
25b20 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
25b30 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
25b40 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
25b50 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
25b60 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
25b70 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
25b80 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
25b90 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
25ba0 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
25bb0 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
25bc0 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
25bd0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
25be0 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
25bf0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
25c00 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
25c10 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
25c20 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
25c30 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
25c40 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
25c50 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
25c60 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61  rgs(pParse, &pTa
25c70 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70  bList->a[ii], &p
25c80 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d  WInfo->sWC);.  }
25c90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25ca0 45 42 55 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b  EBUG.  for(ii=0;
25cb0 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
25cc0 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42  rc; ii++){.    B
25cd0 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74  itmask m = sqlit
25ce0 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
25cf0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
25d00 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
25d10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
25d20 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29 20 29 3b  ==MASKBIT(ii) );
25d30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
25d40 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
25d50 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
25d60 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
25d70 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a  3WhereExprAnalyz
25d80 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  e(pTabList, &pWI
25d90 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
25da0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25db0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
25dc0 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28  ginError;..  if(
25dd0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
25de0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
25df0 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  T ){.    if( isD
25e00 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
25e10 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
25e20 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  t, &pWInfo->sWC,
25e30 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a   pResultSet) ){.
25e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
25e50 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73  TINCT marking is
25e60 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e   pointless.  Ign
25e70 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ore it. */.     
25e80 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25e90 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
25ea0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
25eb0 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72  }else if( pOrder
25ec0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  By==0 ){.      /
25ed0 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42  * Try to ORDER B
25ee0 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  Y the result set
25ef0 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63   to make distinc
25f00 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73  t processing eas
25f10 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  ier */.      pWI
25f20 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
25f30 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  |= WHERE_DISTINC
25f40 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  TBY;.      pWInf
25f50 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52  o->pOrderBy = pR
25f60 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a  esultSet;.    }.
25f70 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72    }..  /* Constr
25f80 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  uct the WhereLoo
25f90 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
25fa0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
25fb0 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
25fc0 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72   Start *** (wctr
25fd0 6c 46 6c 61 67 73 3a 20 30 78 25 78 29 5c 6e 22  lFlags: 0x%x)\n"
25fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ,.             w
25ff0 63 74 72 6c 46 6c 61 67 73 29 29 3b 0a 23 69 66  ctrlFlags));.#if
26000 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
26010 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
26020 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26030 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 20  race & 0x100 ){ 
26040 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74  /* Display all t
26050 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
26060 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
26070 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
26080 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  =0; i<sWLB.pWC->
26090 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
260a0 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
260b0 74 28 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  t(&sWLB.pWC->a[i
260c0 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], i);.    }.  }
260d0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
260e0 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
260f0 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
26100 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
26110 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
26120 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
26130 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
26140 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
26150 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
26160 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
26170 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
26180 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73  ace ){    /* Dis
26190 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
261a0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
261b0 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65  s */.      Where
261c0 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
261d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
261e0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c  ic const char zL
261f0 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35  abel[] = "012345
26200 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c  6789abcdefghijkl
26210 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a  mnopqrstuvwyxz".
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
26250 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
26260 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
26270 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
26280 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
26290 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
262a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
262b0 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73  cId = zLabel[i%s
262c0 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a  izeof(zLabel)];.
262d0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
262e0 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70  pPrint(p, sWLB.p
262f0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WC);.      }.   
26300 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
26310 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
26320 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  (pWInfo, 0);.   
26330 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
26340 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
26350 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
26360 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
26370 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
26380 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
26390 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
263a0 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20  >nRowOut+1);.   
263b0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
263c0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
263d0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
263e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
263f0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
26400 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  y==0 && (db->fla
26410 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
26420 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a  rseOrder)!=0 ){.
26430 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
26440 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29  Mask = (Bitmask)
26450 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (-1);.  }.  if( 
26460 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
26470 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63  NEVER(db->malloc
26480 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67  Failed) ){.    g
26490 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
264a0 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ror;.  }.#ifdef 
264b0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
264c0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
264d0 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
264e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
264f0 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74  intf("---- Solut
26500 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57  ion nRow=%d", pW
26510 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
26520 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
26530 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20  nOBSat>0 ){.    
26540 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26550 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25  intf(" ORDERBY=%
26560 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  d,0x%llx", pWInf
26570 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66  o->nOBSat, pWInf
26580 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
26590 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
265a0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
265b0 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
265c0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
265d0 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
265e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
265f0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
26600 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
26610 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26620 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
26630 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
26640 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
26650 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26660 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
26670 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
26680 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26690 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
266a0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
266b0 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
266c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
266d0 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
266e0 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
266f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26700 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26710 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
26720 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
26730 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
26740 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
26750 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26760 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
26770 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29  WLoop, sWLB.pWC)
26780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
26790 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
267a0 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
267b0 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
267c0 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
267d0 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
267e0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
267f0 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
26800 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
26810 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
26820 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
26830 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
26840 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
26850 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57  bUsed = sqlite3W
26860 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
26870 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73  e(pMaskSet, pRes
26880 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28  ultSet);.    if(
26890 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29   sWLB.pOrderBy )
268a0 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64 20  {.      tabUsed 
268b0 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  |= sqlite3WhereE
268c0 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61  xprListUsage(pMa
268d0 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64  skSet, sWLB.pOrd
268e0 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  erBy);.    }.   
268f0 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
26900 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20  nLevel>=2 ){.   
26910 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
26920 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  erm, *pEnd;.    
26930 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    pLoop = pWInfo
26940 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ->a[pWInfo->nLev
26950 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  el-1].pWLoop;.  
26960 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
26970 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
26980 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f 69  op->iTab].fg.joi
26990 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
269a0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
269b0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
269c0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
269d0 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
269e0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
269f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
26a00 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
26a10 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
26a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26a30 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
26a40 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
26a50 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26a60 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
26a70 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
26a80 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
26a90 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
26aa0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
26ab0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
26ac0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
26ad0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
26ae0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
26af0 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
26b00 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
26b10 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
26b20 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
26b30 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
26b40 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
26b50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
26b60 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
26b70 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
26b80 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
26b90 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
26ba0 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
26bb0 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
26bc0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
26bd0 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
26be0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
26bf0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
26c00 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
26c10 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
26c20 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
26c30 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
26c40 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
26c50 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
26c60 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
26c70 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
26c80 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
26c90 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
26ca0 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
26cb0 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
26cc0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
26cd0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
26ce0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26cf0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
26d00 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
26d10 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
26d20 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
26d30 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
26d40 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26d50 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b  S_DESIRED)!=0 ){
26d60 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
26d70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e   = pWInfo->a[0].
26d80 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
26d90 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77  .    int bOnerow
26da0 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48   = (wsFlags & WH
26db0 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a  ERE_ONEROW)!=0;.
26dc0 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 0a      if( bOnerow.
26dd0 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c 46       || ((wctrlF
26de0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
26df0 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21 3d  PASS_MULTIROW)!=
26e00 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
26e10 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48  0==(wsFlags & WH
26e20 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
26e30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
26e40 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
26e50 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45   = bOnerow ? ONE
26e60 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e  PASS_SINGLE : ON
26e70 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20  EPASS_MULTI;.   
26e80 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
26e90 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
26ea0 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67 73  Tab) && (wsFlags
26eb0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
26ec0 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Y) ){.        if
26ed0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
26ee0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
26ef0 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  TIROW ){.       
26f00 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20     bFordelete = 
26f10 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
26f20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26f30 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
26f40 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
26f50 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57   = (wsFlags & ~W
26f60 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a  HERE_IDX_ONLY);.
26f70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26f80 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
26f90 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
26fa0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
26fb0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
26fc0 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
26fd0 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
26fe0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
26ff0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
27000 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  ->a; ii<nTabList
27010 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  ; ii++, pLevel++
27020 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
27030 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
27040 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
27050 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
27060 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
27070 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
27080 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
27090 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
270a0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
270b0 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  m;..    pTabItem
270c0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
270d0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
270e0 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
270f0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
27100 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
27110 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
27120 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
27130 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
27140 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
27150 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
27160 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
27170 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
27180 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
27190 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
271a0 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
271b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
271c0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
271d0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
271e0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
271f0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
27200 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
27210 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
27220 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
27230 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
27240 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
27250 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
27260 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
27270 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
27280 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
27290 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
272a0 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
272b0 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
272c0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
272d0 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* noop */.    }
272e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
272f0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
27300 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
27310 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
27320 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
27330 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
27340 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  EN_CLOSE)==0 ){.
27350 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
27360 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
27370 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f    if( pWInfo->eO
27380 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
27390 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  OFF ){.        o
273a0 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  p = OP_OpenWrite
273b0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
273c0 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
273d0 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ] = pTabItem->iC
273e0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a  ursor;.      };.
273f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
27400 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
27410 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
27420 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
27430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27440 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
27450 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  r==pLevel->iTabC
27460 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
27470 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
27480 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
27490 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
274a0 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
274b0 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
274c0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
274d0 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
274e0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
274f0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
27500 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
27510 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
27520 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73  >nCol<BMS && Has
27530 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
27540 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
27550 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
27560 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
27570 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
27580 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
27590 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
275a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
275b0 67 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49  geP4(v, -1, SQLI
275c0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
275d0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
275e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
275f0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
27600 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
27610 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
27620 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66  R_HINTS.      if
27630 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
27640 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
27650 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27660 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
27670 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64  LAG_SEEKEQ|bFord
27680 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65  elete);.      }e
27690 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
276a0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
276b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
276c0 2c 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20  , bFordelete);. 
276d0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
276e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
276f0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
27700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27710 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
27720 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62  olumnsUsed, pTab
27730 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
27740 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27760 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61   (const u8*)&pTa
27770 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20  bItem->colUsed, 
27780 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
27790 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
277a0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
277b0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
277c0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
277d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
277e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
277f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27800 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
27810 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
27820 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
27830 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
27840 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  t iIndexCur;.   
27850 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
27860 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f  penRead;.      /
27870 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77  * iIdxCur is alw
27880 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20  ays set if to a 
27890 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
278a0 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73  f ONEPASS is pos
278b0 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  sible */.      a
278c0 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d  ssert( iIdxCur!=
278d0 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63  0 || (pWInfo->wc
278e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
278f0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
27900 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
27910 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
27920 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65  ) && IsPrimaryKe
27930 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20  yIndex(pIx).    
27940 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
27950 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
27960 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20  LE_ONLY)!=0.    
27970 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
27980 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d  This is one term
27990 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69   of an OR-optimi
279a0 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  zation using the
279b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
279c0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54  a.        ** WIT
279d0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
279e0 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61  .  No need for a
279f0 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20   separate index 
27a00 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  */.        iInde
27a10 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
27a20 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20  TabCur;.        
27a30 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  op = 0;.      }e
27a40 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  lse if( pWInfo->
27a50 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
27a60 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
27a70 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61   Index *pJ = pTa
27a80 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e  bItem->pTab->pIn
27a90 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e  dex;.        iIn
27aa0 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  dexCur = iIdxCur
27ab0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27ac0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
27ad0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
27ae0 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  IRED );.        
27af0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a  while( ALWAYS(pJ
27b00 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a  ) && pJ!=pIx ){.
27b10 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78            iIndex
27b20 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Cur++;.         
27b30 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b   pJ = pJ->pNext;
27b40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27b50 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
27b60 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
27b70 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
27b80 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75  ss[1] = iIndexCu
27b90 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
27ba0 66 28 20 69 49 64 78 43 75 72 20 26 26 20 28 77  f( iIdxCur && (w
27bb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27bc0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
27bd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
27be0 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43  IndexCur = iIdxC
27bf0 75 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ur;.        if( 
27c00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27c10 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29 20  RE_REOPEN_IDX ) 
27c20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64  op = OP_ReopenId
27c30 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
27c40 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
27c50 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
27c60 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
27c70 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
27c80 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  r = iIndexCur;. 
27c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
27ca0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
27cb0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
27cc0 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
27cd0 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
27ce0 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20  if( op ){.      
27cf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27d00 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65  Op3(v, op, iInde
27d10 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
27d20 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
27d30 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
27d40 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
27d50 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ix);.        if(
27d60 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
27d70 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
27d80 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20  INT)!=0.        
27d90 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
27da0 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
27db0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
27dc0 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20  SKIPSCAN))==0.  
27dd0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
27de0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
27df0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
27e00 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
27e10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27e20 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27e30 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20  OPFLAG_SEEKEQ); 
27e40 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42  /* Hint to COMDB
27e50 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  2 */.        }. 
27e60 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
27e70 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
27e80 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65  ->zName));.#ifde
27e90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27ea0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
27eb0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
27ec0 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64       u64 colUsed
27ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27ee0 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20  int ii, jj;.    
27ef0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
27f00 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ii<pIx->nColumn;
27f10 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
27f20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69      jj = pIx->ai
27f30 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20  Column[ii];.    
27f40 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30          if( jj<0
27f50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27f60 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e           if( jj>
27f70 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20  63 ) jj = 63;.  
27f80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27f90 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
27fa0 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d   & MASKBIT(jj))=
27fb0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
27fc0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
27fd0 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c  ed |= ((u64)1)<<
27fe0 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33  (ii<63 ? ii : 63
27ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28000 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28010 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
28020 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
28030 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20  , iIndexCur, 0, 
28040 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64     (u8*)&colUsed
28070 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
28080 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
28090 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
280a0 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20  OLUMN_USED_MASK 
280b0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
280c0 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20  .    if( iDb>=0 
280d0 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
280e0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
280f0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
28100 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
28110 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
28120 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
28130 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28140 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
28150 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
28160 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
28170 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
28180 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
28190 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
281a0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
281b0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
281c0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
281d0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
281e0 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
281f0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
28200 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
28210 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
28220 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  st; ii++){.    i
28230 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a  nt addrExplain;.
28240 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
28250 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
28260 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
28270 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76    wsFlags = pLev
28280 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
28290 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ags;.#ifndef SQL
282a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
282b0 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
282c0 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
282d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
282e0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
282f0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
28300 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
28310 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
28320 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
28330 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
28340 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
28350 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
28360 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
28370 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
28380 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
28390 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
283a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
283b0 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
283c0 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
283d0 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50  Scan(.        pP
283e0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
283f0 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
28400 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
28410 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20  Flags.    );.   
28420 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
28430 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  y = sqlite3VdbeC
28440 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
28450 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71     notReady = sq
28460 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e  lite3WhereCodeOn
28470 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
28480 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
28490 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
284a0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
284b0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20  ->addrCont;.    
284c0 69 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45  if( (wsFlags&WHE
284d0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
284e0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  && (wctrlFlags&W
284f0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
28500 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
28510 73 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53  sqlite3WhereAddS
28520 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61  canStatus(v, pTa
28530 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61  bList, pLevel, a
28540 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  ddrExplain);.   
28550 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e   }.  }..  /* Don
28560 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  e. */.  VdbeModu
28570 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  leComment((v, "B
28580 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22  egin WHERE-core"
28590 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  ));.  return pWI
285a0 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
285b0 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
285c0 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
285d0 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  inError:.  if( p
285e0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61  WInfo ){.    pPa
285f0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
28600 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
28610 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77  QueryLoop;.    w
28620 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
28630 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pWInfo);.  }.  
28640 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
28650 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
28660 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
28670 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
28680 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
28690 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
286a0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
286b0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
286c0 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
286d0 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
286e0 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
286f0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
28700 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
28710 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28720 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
28730 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
28740 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
28750 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
28760 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
28770 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
28780 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
28790 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
287a0 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
287b0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
287c0 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ..  */.  VdbeMod
287d0 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
287e0 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29  End WHERE-core")
287f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
28800 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
28810 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e  e);.  for(i=pWIn
28820 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
28830 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; i--){.    in
28840 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76  t addr;.    pLev
28850 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
28860 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  i];.    pLoop = 
28870 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
28880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
28890 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
288a0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
288b0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
288c0 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
288d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
288e0 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76  beAddOp3(v, pLev
288f0 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
28900 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20  p1, pLevel->p2, 
28910 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20  pLevel->p3);.   
28920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28930 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
28940 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62  ->p5);.      Vdb
28950 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28960 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28970 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
28980 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20  ==OP_Next);.    
28990 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
289a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
289b0 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20  OP_Prev);.      
289c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
289d0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  , pLevel->op==OP
289e0 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  _VNext);.    }. 
289f0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
28a00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
28a10 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
28a20 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
28a30 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
28a40 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
28a50 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
28a60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
28a70 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
28a80 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
28a90 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
28aa0 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
28ab0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
28ac0 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
28ad0 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
28ae0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28af0 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
28b00 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
28b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28b20 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  dOp2(v, pIn->eEn
28b30 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43  dLoopOp, pIn->iC
28b40 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
28b50 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
28b60 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28b70 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28b80 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
28b90 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76  dLoopOp==OP_Prev
28ba0 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
28bb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28bc0 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
28bd0 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65  Op==OP_NextIfOpe
28be0 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
28bf0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
28c00 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
28c10 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p-1);.      }.  
28c20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28c30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28c40 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
28c50 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
28c60 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b  vel->addrSkip ){
28c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28c80 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c  beGoto(v, pLevel
28c90 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
28ca0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
28cb0 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63  v, "next skip-sc
28cc0 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70  an on %s", pLoop
28cd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
28ce0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
28cf0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28d00 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
28d10 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
28d20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28d30 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
28d40 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20  addrSkip-2);.   
28d50 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
28d60 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41  E_LIKE_DOESNT_MA
28d70 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66  TCH_BLOBS.    if
28d80 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69  ( pLevel->addrLi
28d90 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20 69  keRep ){.      i
28da0 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  nt op;.      if(
28db0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
28dc0 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  p(v, pLevel->add
28dd0 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31 20  rLikeRep-1)->p1 
28de0 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
28df0 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3b  OP_DecrJumpZero;
28e00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28e10 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a 75        op = OP_Ju
28e20 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20 20  mpZeroIncr;.    
28e30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
28e40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
28e50 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  p, pLevel->iLike
28e60 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c 2d  RepCntr, pLevel-
28e70 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20  >addrLikeRep);. 
28e80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28e90 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  e(v);.    }.#end
28ea0 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  if.    if( pLeve
28eb0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
28ec0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
28ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
28ee0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
28ef0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
28f00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
28f10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
28f20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
28f30 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
28f40 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
28f50 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  | (pLoop->wsFlag
28f60 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
28f70 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)!=0 );.      i
28f80 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
28f90 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
28fa0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
28fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28fc0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
28fd0 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
28fe0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
28ff0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29000 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
29010 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
29020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29030 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
29040 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
29050 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
29060 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
29070 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
29080 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
29090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
290a0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
290b0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
290c0 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
290d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
290e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
290f0 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  to(v, pLevel->ad
29100 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
29110 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
29120 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
29130 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ddr);.    }.    
29140 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
29150 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
29160 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c  -loop%d: %s", i,
29170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29180 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54        pWInfo->pT
29190 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
291a0 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a  ->iFrom].pTab->z
291b0 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Name));.  }..  /
291c0 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
291d0 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
291e0 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
291f0 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
29200 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
29210 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
29220 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
29230 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
29240 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ;..  assert( pWI
29250 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61  nfo->nLevel<=pTa
29260 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
29270 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
29280 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57  =pWInfo->a; i<pW
29290 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
292a0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
292b0 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20    int k, last;. 
292c0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
292d0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
292e0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
292f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
29300 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
29310 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
29320 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
29330 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
29340 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
29350 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
29360 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
29370 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
29380 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74  /* For a co-rout
29390 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20  ine, change all 
293a0 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65  OP_Column refere
293b0 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c  nces to the tabl
293c0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
293d0 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20  co-routine into 
293e0 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c  OP_Copy of resul
293f0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  t contained in a
29400 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a   register..    *
29410 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d  * OP_Rowid becom
29420 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20  es OP_Null..    
29430 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49  */.    if( pTabI
29440 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
29450 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c  tine && !db->mal
29460 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
29470 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75     translateColu
29480 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c 65 76  mnToCopy(v, pLev
29490 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c  el->addrBody, pL
294a0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294c0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 49             pTabI
294d0 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20  tem->regResult, 
294e0 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  0);.      contin
294f0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
29500 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
29510 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
29520 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
29530 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29540 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
29550 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75   do not close cu
29560 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20  rsors that will 
29570 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65  be reused by the
29580 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
29590 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f  .    ** (WHERE_O
295a0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e  MIT_OPEN_CLOSE).
295b0 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
295c0 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
295d0 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
295e0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
295f0 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
29600 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
29610 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
29620 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
29630 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
29640 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
29650 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
29660 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
29670 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
29680 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20  N_CLOSE)==0.    
29690 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
296a0 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
296b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
296c0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
296d0 45 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77 73  EPASS_OFF && (ws
296e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
296f0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
29700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29710 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
29720 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
29730 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
29740 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
29750 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
29760 20 20 20 20 20 26 26 20 28 77 73 20 26 20 28 57       && (ws & (W
29770 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41  HERE_IPK|WHERE_A
29780 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a  UTO_INDEX))==0 .
29790 20 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c         && pLevel
297a0 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66  ->iIdxCur!=pWInf
297b0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
297c0 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1].      ){.    
297d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
297e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
297f0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
29800 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
29810 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
29820 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
29830 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45  index, make VDBE
29840 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
29850 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
29860 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
29870 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
29880 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  f from the table
29890 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
298a0 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a    In some cases.
298b0 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69      ** this opti
298c0 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74  mization prevent
298d0 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  s the table from
298e0 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64   ever being read
298f0 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20  , which can.    
29900 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69  ** yield a signi
29910 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e  ficant performan
29920 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a  ce boost..    **
29930 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
29940 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
29950 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
29960 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29970 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
29980 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
29990 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
299a0 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
299b0 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
299c0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
299d0 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
299e0 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
299f0 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
29a00 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
29a10 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
29a20 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
29a30 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
29a40 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
29a50 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
29a60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29a70 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
29a80 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44  & (WHERE_INDEXED
29a90 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  |WHERE_IDX_ONLY)
29aa0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
29ab0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
29ac0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
29ad0 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
29ae0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
29af0 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  TI_OR ){.      p
29b00 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  Idx = pLevel->u.
29b10 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20  pCovidx;.    }. 
29b20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20     if( pIdx.    
29b30 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e   && (pWInfo->eOn
29b40 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
29b50 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  FF || !HasRowid(
29b60 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20  pIdx->pTable)). 
29b70 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c      && !db->mall
29b80 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a  ocFailed.    ){.
29b90 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
29ba0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
29bb0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20  ddr(v);.      k 
29bc0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f  = pLevel->addrBo
29bd0 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20  dy;.      pOp = 
29be0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
29bf0 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f  (v, k);.      fo
29c00 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  r(; k<last; k++,
29c10 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
29c20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
29c30 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
29c40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
29c50 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
29c60 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
29c70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
29c80 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
29c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
29ca0 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20  x->pTable==pTab 
29cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29cc0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
29cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29ce0 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
29cf0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
29d00 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
29d10 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e         x = pPk->
29d20 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20  aiColumn[x];.   
29d30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29d40 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x>=0 );.       
29d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78     }.          x
29d60 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
29d70 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29  OfIndex(pIdx, x)
29d80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29d90 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x>=0 ){.        
29da0 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b      pOp->p2 = x;
29db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
29dc0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
29dd0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
29de0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
29df0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
29e00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
29e10 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e  X_ONLY)==0 || x>
29e20 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  =0 );.        }e
29e30 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
29e40 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
29e50 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
29e60 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
29e70 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
29e80 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
29e90 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
29ea0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29eb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
29ec0 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
29ed0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
29ee0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
29ef0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
29f00 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
29f10 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
29f20 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.