/ Hex Artifact Content
Login

Artifact f06ac362cfb64c16cb02df7aa756f35b5f3455c6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53  * Return ONEPASS
0840: 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20 55  _OFF (0) if an U
0850: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0860: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61  statement is una
0870: 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74  ble to.** operat
0880: 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68  e directly on th
0890: 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64  e rowis returned
08a0: 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75   by a WHERE clau
08b0: 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f  se.  Return.** O
08c0: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31  NEPASS_SINGLE (1
08d0: 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) if the stateme
08e0: 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e  nt can operation
08f0: 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75 73   directly becaus
0900: 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67  e only.** a sing
0910: 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20  le row is to be 
0920: 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e  changed.  Return
0930: 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28   ONEPASS_MULTI (
0940: 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61  2) if the one-pa
0950: 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  ss.** optimizati
0960: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f  on can be used o
0970: 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a  n multiple .**.*
0980: 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53  * If the ONEPASS
0990: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
09a0: 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72   used (if this r
09b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
09c0: 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73  rue).** then als
09d0: 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69  o write the indi
09e0: 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73  ces of open curs
09f0: 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50  ors used by ONEP
0a00: 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75  ASS.** into aiCu
0a10: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0a20: 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74  ].  iaCur[0] get
0a30: 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20  s the cursor of 
0a40: 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c  the data.** tabl
0a50: 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67  e and iaCur[1] g
0a60: 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75  ets the cursor u
0a70: 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69  sed by an auxili
0a80: 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69  ary index..** Ei
0a90: 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62  ther value may b
0aa0: 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67  e -1, indicating
0ab0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20   that cursor is 
0ac0: 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79  not used..** Any
0ad0: 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65   cursors returne
0ae0: 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  d will have been
0af0: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
0b00: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72  ing..**.** aiCur
0b10: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
0b20: 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20   both get -1 if 
0b30: 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65  the where-clause
0b40: 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61   logic is.** una
0b50: 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f  ble to use the O
0b60: 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
0b70: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
0b80: 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73  te3WhereOkOnePas
0b90: 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  s(WhereInfo *pWI
0ba0: 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29  nfo, int *aiCur)
0bb0: 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72  {.  memcpy(aiCur
0bc0: 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  , pWInfo->aiCurO
0bd0: 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69  nePass, sizeof(i
0be0: 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57  nt)*2);.#ifdef W
0bf0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
0c00: 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
0c10: 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57 49  hereTrace && pWI
0c20: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
0c30: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
0c40: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
0c50: 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72 73  intf("%s cursors
0c60: 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  : %d %d\n",.    
0c70: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e       pWInfo->eOn
0c80: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53  ePass==ONEPASS_S
0c90: 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53  INGLE ? "ONEPASS
0ca0: 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50  _SINGLE" : "ONEP
0cb0: 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20  ASS_MULTI",.    
0cc0: 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61       aiCur[0], a
0cd0: 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65  iCur[1]);.  }.#e
0ce0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57  ndif.  return pW
0cf0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a  Info->eOnePass;.
0d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0d10: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0d20: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0d30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0d40: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0d50: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0d60: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0d70: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0d80: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0d90: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0da0: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0db0: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0dc0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0dd0: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0de0: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0df0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0e00: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0e10: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0e20: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0e30: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0e40: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0e50: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0e60: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0e70: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0e80: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0e90: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0ea0: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0eb0: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0ec0: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0ed0: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0ee0: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0ef0: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0f00: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0f10: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0f20: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0f30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0f40: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0f50: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0f60: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0f70: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0f90: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0fa0: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0fb0: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0fc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0fd0: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0fe0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0ff0: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
1000: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
1010: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
1020: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
1030: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
1040: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
1050: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
1060: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
1070: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
1080: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
1090: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
10a0: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
10b0: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
10c0: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
10d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10f0: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
1100: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
1110: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
1120: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
1130: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
1140: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
1150: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
1160: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1170: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
1180: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
1190: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
11a0: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
11b0: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
11c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
11d0: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
11e0: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
11f0: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
1200: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
1210: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
1220: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1230: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1240: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1250: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
1260: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
1270: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
1280: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
1290: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
12a0: 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74  */.Bitmask sqlit
12b0: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57  e3WhereGetMask(W
12c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
12d0: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
12e0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
12f0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1300: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
1310: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
1320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
1330: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
1340: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
1350: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
1360: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1370: 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
1380: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
13a0: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
13b0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
13c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
13d0: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
13e0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
13f0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
1400: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
1410: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1420: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
1430: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
1440: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
1450: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
1460: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
1470: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
1480: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
1490: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
14a0: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
14b0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
14c0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
14d0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
14e0: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
14f0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
1500: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
1510: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
1520: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
1530: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
1540: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  sor;.}../*.** Ad
1550: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1560: 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74  t WhereTerm that
1570: 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69   matches accordi
1580: 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72  ng to the criter
1590: 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65  ia.** establishe
15a0: 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e  d when the pScan
15b0: 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74   object was init
15c0: 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65  ialized by where
15d0: 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52  ScanInit()..** R
15e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
15f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1600: 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65  matching WhereTe
1610: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  rms..*/.static W
1620: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
1630: 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61  canNext(WhereSca
1640: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74  n *pScan){.  int
1650: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
1660: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1670: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1680: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20  e term */.  i16 
1690: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
16a0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
16b0: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
16c0: 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49   term.  -1 for I
16d0: 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  PK */.  Expr *pX
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  An expression be
1700: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
1710: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1720: 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  ;    /* Shorthan
1730: 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43  d for pScan->pWC
1740: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1750: 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68  *pTerm;    /* Th
1760: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73  e term being tes
1770: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d  ted */.  int k =
1780: 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a   pScan->k;    /*
1790: 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20   Where to start 
17a0: 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77  scanning */..  w
17b0: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
17c0: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
17d0: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
17e0: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53   pScan->aiCur[pS
17f0: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1800: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53      iColumn = pS
1810: 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 53  can->aiColumn[pS
1820: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1830: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
1840: 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63 61  =XN_EXPR && pSca
1850: 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29  n->pIdxExpr==0 )
1860: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
1870: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
1880: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
1890: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
18a0: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
18b0: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
18c0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
18d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
18e0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
18f0: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
1900: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
1910: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
1920: 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52  iColumn!=XN_EXPR
1930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
1940: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1950: 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  are(pTerm->pExpr
1960: 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70  ->pLeft,pScan->p
1970: 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30  IdxExpr,iCur)==0
1980: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
1990: 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20  Scan->iEquiv<=1 
19a0: 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
19b0: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
19c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
19d0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
19e0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1a00: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
1a10: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
1a20: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
1a30: 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20  pScan->aiCur).  
1a40: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20           && (pX 
1a50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1a60: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
1a70: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d  pExpr->pRight))-
1a80: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
1a90: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
1ab0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1ac0: 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71  =0; j<pScan->nEq
1ad0: 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  uiv; j++){.     
1ae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
1af0: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58  an->aiCur[j]==pX
1b00: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
1b10: 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e          && pScan
1b20: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70  ->aiColumn[j]==p
1b30: 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  X->iColumn ){.  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b80: 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e   if( j==pScan->n
1b90: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20  Equiv ){.       
1ba0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69         pScan->ai
1bb0: 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61  Cur[j] = pX->iTa
1bc0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
1bd0: 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75     pScan->aiColu
1be0: 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c  mn[j] = pX->iCol
1bf0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
1c00: 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76     pScan->nEquiv
1c10: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1c20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1c30: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
1c40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1c50: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
1c60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1c70: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
1c80: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
1c90: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
1ca0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
1cb0: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
1cc0: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
1cd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1ce0: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
1d00: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
1d20: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
1d30: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d50: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1d60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1d70: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
1d80: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
1d90: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1db0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dd0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1de0: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1e00: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
1e10: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1e20: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
1e60: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
1e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e80: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
1e90: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1ea0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ec0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1ed0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
1ee0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
1ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f00: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f30: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1f40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1f50: 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a  O_EQ|WO_IS))!=0.
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1f70: 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  (pX = pTerm->pEx
1f80: 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d  pr->pRight)->op=
1f90: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
1fa0: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
1fb0: 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69  Table==pScan->ai
1fc0: 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  Cur[0].         
1fd0: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
1fe0: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c  mn==pScan->aiCol
1ff0: 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  umn[0].         
2000: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2010: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2020: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2030: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
2040: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2050: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2060: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
2070: 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20  n->k = k+1;.    
2080: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2090: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
20a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20b0: 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d    }.      pScan-
20c0: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
20d0: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
20e0: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   k = 0;.    }.  
20f0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
2100: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20  Scan->pOrigWC;. 
2110: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53     k = 0;.    pS
2120: 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20  can->iEquiv++;. 
2130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2150: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
2160: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
2170: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2180: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
2190: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
21a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
21b0: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
21c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
21d0: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
21e0: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
21f0: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
2200: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
2210: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
2220: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
2230: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
2240: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
2250: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
2260: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
2270: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
2280: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
2290: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
22a0: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
22b0: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
22c0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
22d0: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
22e0: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
22f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2300: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
2310: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
2320: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
2330: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
2340: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
2350: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
2360: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
2370: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
2380: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
2390: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
23a0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
23b0: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
23c0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
23d0: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
23e0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
23f0: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
2400: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  Idx..*/.static W
2410: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
2420: 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65  canInit(.  Where
2430: 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20  Scan *pScan,    
2440: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53     /* The WhereS
2450: 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  can object being
2460: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2470: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2480: 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC,       /* The
2490: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
24a0: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
24b0: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
24c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
24d0: 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  or to scan for *
24e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2500: 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f  olumn to scan fo
2510: 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73  r */.  u32 opMas
2520: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
2530: 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f  * Operator(s) to
2540: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49   scan for */.  I
2550: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2560: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
2570: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
2580: 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  h this index */.
2590: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a  ){.  int j = 0;.
25a0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
25b0: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
25c0: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
25d0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
25e0: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
25f0: 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e  = pWC;.  pScan->
2600: 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20  pIdxExpr = 0;.  
2610: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
2620: 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  j = iColumn;.   
2630: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
2640: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2650: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58    if( iColumn==X
2660: 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d 3e  N_EXPR ) pScan->
2670: 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d  pIdxExpr = pIdx-
2680: 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
2690: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  pExpr;.  }.  if(
26a0: 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e   pIdx && iColumn
26b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e  >=0 ){.    pScan
26c0: 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d  ->idxaff = pIdx-
26d0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
26e0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
26f0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
2700: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
2710: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
2720: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
2730: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
2740: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
2750: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2760: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2770: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2780: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2790: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
27a0: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
27b0: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
27c0: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
27d0: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
27e0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
27f0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2800: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2810: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2820: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2830: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2840: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2850: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2860: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2870: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2880: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
2890: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
28a0: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
28b0: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
28c0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
28d0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
28e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28f0: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
2900: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
2910: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49  und..**.** If pI
2920: 64 78 21 3d 30 20 74 68 65 6e 20 73 65 61 72 63  dx!=0 then searc
2930: 68 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63  h for terms matc
2940: 68 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e  hing the iColumn
2950: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49  -th column of pI
2960: 64 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  dx.** rather tha
2970: 6e 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  n the iColumn-th
2980: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2990: 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iCur..**.** The
29a0: 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d   term returned m
29b0: 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e  ight by Y=<expr>
29c0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f   if there is ano
29d0: 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20  ther constraint 
29e0: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
29f0: 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63  clause that spec
2a00: 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20  ifies that X=Y. 
2a10: 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72   Any such constr
2a20: 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  aints will be.**
2a30: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
2a40: 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20  he WO_EQUIV bit 
2a50: 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f  in the pTerm->eO
2a60: 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20  perator field.  
2a70: 54 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69  The.** aiCur[]/i
2a80: 61 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73  aColumn[] arrays
2a90: 20 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20   hold X and all 
2aa0: 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e  its equivalents.
2ab0: 20 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a   There are 11.**
2ac0: 20 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b   slots in aiCur[
2ad0: 5d 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20  ]/aiColumn[] so 
2ae0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
2af0: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
2b00: 73 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74  s up to 10.** ot
2b10: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
2b20: 61 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20  alues.  Hence a 
2b30: 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c  search for X wil
2b40: 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20  l return <expr> 
2b50: 69 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41  if X=A1.** and A
2b60: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61  1=A2 and A2=A3 a
2b70: 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31  nd ... and A9=A1
2b80: 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e  0 and A10=<expr>
2b90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
2ba0: 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65   are multiple te
2bb0: 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
2bc0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
2bd0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2be0: 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20  r>".** then try 
2bf0: 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68  for the one with
2c00: 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73   no dependencies
2c10: 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20   on <expr> - in 
2c20: 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72  other words wher
2c30: 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61  e.** <expr> is a
2c40: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
2c50: 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  sion of some kin
2c60: 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20  d.  Only return 
2c70: 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68  entries of.** th
2c80: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
2c90: 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63  " where Y is a c
2ca0: 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72  olumn in another
2cb0: 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72   table if no ter
2cc0: 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  ms of.** the for
2cd0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74  m "X <op> <const
2ce0: 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20  -expr>" exist.  
2cf0: 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74   If no terms wit
2d00: 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53  h a constant RHS
2d10: 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74  .** exist, try t
2d20: 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20  o return a term 
2d30: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
2d40: 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57  e WO_EQUIV..*/.W
2d50: 68 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65  hereTerm *sqlite
2d60: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a  3WhereFindTerm(.
2d70: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2d80: 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
2d90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
2da0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
2db0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
2dc0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2dd0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2de0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
2df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e00: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  mn number of LHS
2e10: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
2e20: 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52  tReady,     /* R
2e30: 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72  HS must not over
2e40: 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61  lap with this ma
2e50: 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20  sk */.  u32 op, 
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e70: 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76   Mask of WO_xx v
2e80: 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67  alues describing
2e90: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49   operator */.  I
2ea0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2eb0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2ec0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
2ed0: 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e  this index, if n
2ee0: 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
2ef0: 57 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75  WhereTerm *pResu
2f00: 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54  lt = 0;.  WhereT
2f10: 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53  erm *p;.  WhereS
2f20: 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d  can scan;..  p =
2f30: 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
2f40: 73 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c  scan, pWC, iCur,
2f50: 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49   iColumn, op, pI
2f60: 64 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f  dx);.  op &= WO_
2f70: 45 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c  EQ|WO_IS;.  whil
2f80: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
2f90: 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  (p->prereqRight 
2fa0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
2fb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
2fc0: 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26  rereqRight==0 &&
2fd0: 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f   (p->eOperator&o
2fe0: 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)!=0 ){.       
2ff0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f   testcase( p->eO
3000: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
3010: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3020: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
3030: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
3040: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
3050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
3060: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
3070: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
3080: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
3090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30a0: 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74  n searches pList
30b0: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68   for an entry th
30c0: 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
30d0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
30e0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
30f0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
3100: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
3110: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
3120: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
3130: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
3140: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
3150: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
3160: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
3170: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
3180: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
3190: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
31a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
31b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
31c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
31f0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
3200: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3220: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
3230: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
3240: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
3250: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3270: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
3280: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
3290: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32b0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
32c0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
32d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
32e0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
32f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
3300: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
3310: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
3320: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3330: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
3340: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
3350: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3360: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3370: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
3380: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
3390: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
33a0: 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
33b0: 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
33c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
33d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
33e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
33f0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
3400: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
3410: 70 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  pColl && 0==sqli
3420: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
3430: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
3440: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3450: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
3460: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3470: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
3480: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
3490: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
34a0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  of index pIdx is
34b0: 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61   NOT NULL.*/.sta
34c0: 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c  tic int indexCol
34d0: 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78  umnNotNull(Index
34e0: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
34f0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
3500: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
3510: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
3520: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
3530: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20  >nColumn );.  j 
3540: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
3550: 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e  [iCol];.  if( j>
3560: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3570: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
3580: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a  Col[j].notNull;.
3590: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28    }else if( j==(
35a0: 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
35b0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
35c0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32    assert( j==(-2
35d0: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
35e0: 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e  0;  /* Assume an
35f0: 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73   indexed express
3600: 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79  ion can always y
3610: 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a  ield a NULL */..
3620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
3630: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
3640: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
3650: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
3660: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
3670: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
3680: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
3690: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
36a0: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79  redundant if any
36b0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63   subset of the c
36c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  olumns in the.**
36d0: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61   DISTINCT list a
36e0: 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  re collectively 
36f0: 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76  unique and indiv
3700: 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c  idually non-null
3710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3720: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
3730: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
3740: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
3750: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3760: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
3770: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
3780: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
3790: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
37a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
37b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
37c0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
37d0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
37e0: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  t       /* The r
37f0: 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e  esult set that n
3800: 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49  eeds to be DISTI
3810: 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  NCT */.){.  Tabl
3820: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
3830: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
3860: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
3870: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
3880: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
3890: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
38a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
38b0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
38c0: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
38d0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
38e0: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
38f0: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
3900: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
3910: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
3920: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
3930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
3940: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
3950: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
3960: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
3970: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
3980: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
3990: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
39a0: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
39b0: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
39c0: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
39d0: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
39e0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
39f0: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
3a00: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
3a10: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
3a20: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
3a30: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
3a40: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
3a50: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
3a60: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
3a70: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3a80: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3a90: 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d  llate(pDistinct-
3aa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3ab0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3ac0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
3ad0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
3ae0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
3af0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
3b00: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
3b10: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
3b20: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
3b30: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
3b40: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
3b50: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
3b60: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
3b70: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
3b80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
3b90: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
3ba0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
3bb0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
3bc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
3bd0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
3be0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
3bf0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
3c00: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
3c10: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
3c20: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
3c30: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
3c40: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
3c50: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
3c60: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
3c70: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
3c80: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
3c90: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
3ca0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
3cb0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
3cc0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
3cd0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
3ce0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
3cf0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
3d00: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
3d10: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
3d20: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
3d30: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
3d40: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
3d50: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
3d60: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
3d70: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
3d80: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
3d90: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
3da0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
3db0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
3dc0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
3dd0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
3de0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
3df0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
3e00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
3e10: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
3e20: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
3e30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
3e40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
3e50: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
3e60: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
3e70: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
3e80: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
3e90: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
3ea0: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
3eb0: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
3ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3ed0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
3ee0: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
3ef0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
3f00: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
3f10: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
3f20: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
3f30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
3f40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3f50: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
3f60: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
3f70: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
3f80: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
3f90: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
3fa0: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
3fb0: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
3fc0: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
3fd0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
3fe0: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
3ff0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
4000: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
4010: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
4020: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
4030: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
4040: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
4050: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
4060: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
4070: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
4080: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
4090: 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74  o OP_Copy when t
40a0: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
40b0: 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  g accessed via c
40c0: 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e  o-routine .** in
40d0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
40e0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a  le lookup..**.**
40f0: 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77   If the bIncrRow
4100: 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  id parameter is 
4110: 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52  0, then any OP_R
4120: 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  owid instruction
4130: 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69  s on.** cursor i
4140: 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73  TabCur are trans
4150: 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e  formed into OP_N
4160: 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63  ull. Or, if bInc
4170: 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  rRowid is non-ze
4180: 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68  ro,.** then each
4190: 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61   OP_Rowid is tra
41a0: 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e  nsformed into an
41b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
41c0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  increment the.**
41d0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
41e0: 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69   its output regi
41f0: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
4200: 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f  void translateCo
4210: 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64  lumnToCopy(.  Vd
4220: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4230: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f    /* The VDBE co
4240: 6e 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f  ntaining code to
4250: 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20   translate */.  
4260: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
4270: 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65      /* Translate
4280: 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64   from this opcod
4290: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  e to the end */.
42a0: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
42b0: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75        /* OP_Colu
42c0: 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65  mn/OP_Rowid refe
42d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
42e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
42f0: 65 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a  egister,      /*
4300: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   The first colum
4310: 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67  n is in this reg
4320: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  ister */.  int b
4330: 49 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f  IncrRowid      /
4340: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * If non-zero, t
4350: 72 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69  ransform OP_rowi
4360: 64 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31  d to OP_AddImm(1
4370: 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70  ) */.){.  VdbeOp
4380: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
4390: 64 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61  dbeGetOp(v, iSta
43a0: 72 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  rt);.  int iEnd 
43b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
43c0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66  rentAddr(v);.  f
43d0: 6f 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64  or(; iStart<iEnd
43e0: 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b  ; iStart++, pOp+
43f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  +){.    if( pOp-
4400: 3e 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63  >p1!=iTabCur ) c
4410: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
4420: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
4430: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
4440: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
4450: 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f  P_Copy;.      pO
4460: 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20  p->p1 = pOp->p2 
4470: 2b 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20  + iRegister;.   
4480: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70     pOp->p2 = pOp
4490: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ->p3;.      pOp-
44a0: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  >p3 = 0;.    }el
44b0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
44c0: 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
44d0: 20 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52        if( bIncrR
44e0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
44f0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
4500: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
4510: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
4520: 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e  of the OP_Rowid.
4530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   */.        pOp-
4540: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64  >opcode = OP_Add
4550: 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  Imm;.        pOp
4560: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ->p1 = pOp->p2;.
4570: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
4580: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
4590: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  {.        pOp->o
45a0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
45b0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
45c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
45d0: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20  p->p3 = 0;.     
45e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
45f0: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
4600: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
4610: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
4620: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
4630: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
4640: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
4650: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
4660: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
4670: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
4680: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
4690: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
46a0: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
46b0: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
46c0: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
46d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
46e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
46f0: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
4700: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
4710: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
4720: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
4730: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4740: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4750: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4760: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4780: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
4790: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
47a0: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
47b0: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
47c0: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
47d0: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
47e0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
47f0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4800: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
4810: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4820: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
4830: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
4840: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
4850: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4860: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
4870: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4880: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
4890: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
48a0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
48b0: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
48c0: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
48d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
48e0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
48f0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
4900: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
4910: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
4920: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4930: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
4940: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4950: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4960: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4970: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4980: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4990: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
49a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
49b0: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
49c0: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
49d0: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
49e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
49f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
4a00: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
4a10: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4a20: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
4a30: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
4a40: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4a50: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
4a60: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
4a70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4a80: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
4a90: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
4aa0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4ab0: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
4ac0: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
4ad0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
4ae0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4af0: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b00: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
4b10: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
4b20: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4b30: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b40: 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20  edRows=%lld\n", 
4b50: 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  p->estimatedRows
4b60: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
4b70: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
4b80: 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
4b90: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
4ba0: 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
4bb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4bc0: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
4bd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
4be0: 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
4bf0: 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
4c00: 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
4c10: 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
4c20: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
4c30: 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
4c40: 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
4c50: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
4c60: 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4c80: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
4c90: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
4ca0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
4cb0: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
4cc0: 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
4cd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4cf0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
4d00: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
4d10: 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
4d20: 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
4d40: 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
4d50: 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
4d60: 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
4d70: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
4d80: 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
4d90: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
4da0: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4db0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
4dc0: 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  _EQ|WO_IS))==0 )
4dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4de0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
4df0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4e00: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
4e10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
4e20: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
4e30: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
4e40: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
4e50: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
4e60: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
4e70: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
4e80: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
4e90: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
4ea0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
4eb0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
4ec0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4ed0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
4ee0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
4ef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4f00: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4f10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4f20: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
4f30: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
4f40: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
4f50: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
4f60: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
4f70: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
4f80: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
4f90: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
4fa0: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
4fb0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
4fc0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
4fd0: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
4fe0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
4ff0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5010: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
5020: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
5030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5040: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5050: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5060: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5070: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5080: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5090: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
50a0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
50b0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
50c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
50d0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
50e0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
50f0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
5100: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
5110: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
5120: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
5130: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5160: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5170: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5190: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
51a0: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
51b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
51c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
51d0: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
51e0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
51f0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
5200: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
5210: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
5220: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
5230: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5240: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5270: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5280: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5290: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
52b0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
52c0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
52d0: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
52e0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5300: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
5310: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5320: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
5330: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5340: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5350: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5360: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5370: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5380: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5390: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
53a0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
53b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
53c0: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
53d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
53f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5400: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5420: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5430: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5440: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5450: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5460: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5470: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5480: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5490: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
54b0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
54c0: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
54e0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
54f0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
5500: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5510: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5520: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5530: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5540: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5550: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5560: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5570: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5580: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5590: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
55a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
55b0: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
55c0: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
55d0: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
55e0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
55f0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
5600: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5610: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5620: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5630: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5640: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5650: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5660: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5670: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5680: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5690: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
56a0: 64 64 72 43 6f 75 6e 74 65 72 3b 20 20 20 20 20  ddrCounter;     
56b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
56c0: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
56d0: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
56e0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
56f0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5700: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5710: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
5720: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
5730: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
5740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5750: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
5760: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
5770: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
5780: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
5790: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
57a0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
57b0: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
57c0: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
57d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
57e0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
57f0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
5800: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
5810: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
5820: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
5830: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5840: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
5850: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5860: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
5870: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
5880: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
5890: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
58a0: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
58b0: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
58c0: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
58d0: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
58e0: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
58f0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
5900: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
5910: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
5920: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
5930: 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
5940: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
5950: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
5960: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5970: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
5980: 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72  omJoin)    /* pr
5990: 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  ereq always non-
59a0: 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20  zero */.        
59b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
59c0: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63  tJoinTable!=pSrc
59d0: 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20  ->iCursor   /*  
59e0: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
59f0: 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  and   */.       
5a00: 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72    || pLoop->prer
5a10: 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  eq!=0 );        
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a30: 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46    table of a LEF
5a40: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66  T JOIN */.    if
5a50: 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d  ( pLoop->prereq=
5a60: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
5a70: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
5a80: 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20  M_VIRTUAL)==0.  
5a90: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
5aa0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5ab0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
5ac0: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
5ad0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45  TableConstant(pE
5ae0: 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  xpr, pSrc->iCurs
5af0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  or) ){.      pPa
5b00: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45  rtial = sqlite3E
5b10: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
5b20: 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20  b, pPartial,.   
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5b50: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
5b60: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
5b70: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
5b80: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
5b90: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
5ba0: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
5bb0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5bc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
5bd0: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
5be0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
5bf0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
5c00: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
5c10: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
5c20: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
5c30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
5c40: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
5c50: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
5c60: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
5c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5c80: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
5c90: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
5ca0: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
5cb0: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
5cc0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
5cd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
5ce0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
5cf0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
5d00: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
5d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d20: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d30: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5d40: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
5d50: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
5d60: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
5d70: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
5d80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
5d90: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
5da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5db0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
5dc0: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
5dd0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
5de0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
5df0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5e00: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
5e10: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
5e20: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
5e30: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
5e40: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
5e50: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
5e60: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
5e70: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
5e80: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
5ea0: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
5eb0: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
5ec0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
5ed0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
5ee0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
5ef0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
5f00: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
5f10: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
5f20: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
5f30: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
5f40: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
5f50: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
5f60: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
5f70: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
5f80: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
5f90: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
5fa0: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
5fb0: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
5fc0: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
5fd0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5fe0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
5ff0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
6000: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
6010: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
6020: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
6030: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
6040: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
6050: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
6060: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
6070: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
6080: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
6090: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
60a0: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
60b0: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
60c0: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
60d0: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
60e0: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
60f0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
6100: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6110: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
6120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
6130: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
6140: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6150: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
6160: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
6170: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
6180: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
6190: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
61a0: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
61b0: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
61c0: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
61d0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
61e0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
61f0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
6200: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
6210: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
6220: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
6230: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
6240: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
6250: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
6260: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
6270: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
6280: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
6290: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
62a0: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
62b0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
62c0: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
62d0: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
62e0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
62f0: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
6300: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
6310: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
6320: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
6330: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
6340: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6350: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6360: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6370: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6380: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6390: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
63a0: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
63b0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
63c0: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
63d0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
63e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
63f0: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
6400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
6410: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
6420: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
6430: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
6440: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6450: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
6460: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
6470: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
6480: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
6490: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
64a0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
64b0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
64c0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
64d0: 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20  ll[n] = pColl ? 
64e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
64f0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
6500: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
6510: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6520: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
6530: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
6540: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
6550: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
6560: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
6570: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6580: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
6590: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
65a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
65b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
65c0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
65d0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
65e0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
65f0: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
6600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6610: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
6620: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6630: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
6640: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
6650: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
6660: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
6670: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
6680: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6690: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
66a0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
66b0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
66c0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
66d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
66e0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
66f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6700: 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49  = XN_ROWID;.  pI
6710: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6720: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
6730: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6740: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6750: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6760: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6770: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6780: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6790: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
67a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
67b0: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
67c0: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
67d0: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
67e0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
67f0: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6800: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
6810: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
6820: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6830: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6840: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6850: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6860: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6870: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6880: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6890: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
68a0: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
68b0: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
68c0: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
68d0: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
68e0: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
68f0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
6900: 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d     addrCounter =
6910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6920: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6930: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6950: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
6960: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
6970: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
6980: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64  illSub);.    add
6990: 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56  rTop =  sqlite3V
69a0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
69b0: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
69c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
69d0: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
69e0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
69f0: 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c   row of \"%s\"",
6a00: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
6a10: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  >zName));.  }els
6a20: 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  e{.    addrTop =
6a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a40: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
6a50: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6a60: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6a70: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
6a80: 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43  artial ){.    iC
6a90: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6aa0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6ac0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6ad0: 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e  , pPartial, iCon
6ae0: 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tinue, SQLITE_JU
6af0: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
6b00: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
6b10: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
6b20: 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f  X;.  }.  regReco
6b30: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
6b40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b50: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
6b60: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
6b70: 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73  Key(.      pPars
6b80: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
6b90: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
6ba0: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a  ord, 0, 0, 0, 0.
6bb0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
6bc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6bd0: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
6be0: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
6bf0: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6c00: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c10: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c20: 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
6c30: 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
6c40: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6c50: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
6c60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6c70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6c80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6c90: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
6ca0: 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73  rCounter, regBas
6cb0: 65 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  e+n);.    transl
6cc0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
6cd0: 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76  v, addrTop, pLev
6ce0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61  el->iTabCur, pTa
6cf0: 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
6d00: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6d10: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
6d20: 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49  rTop);.    pTabI
6d30: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6d40: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6d50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6d60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6d70: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6d80: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
6d90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6da0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6db0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6dc0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
6dd0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
6de0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6df0: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6e00: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6e10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6e20: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6e30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6e40: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6e50: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6e60: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6e70: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6e80: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
6e90: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
6ea0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
6eb0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
6ec0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6ed0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
6ee0: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6ef0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6f00: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6f10: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6f20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6f30: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6f40: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6f50: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6f60: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6f70: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6f80: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
6f90: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
6fa0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
6fb0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
6fc0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
6fd0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
6fe0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
6ff0: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
7000: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
7010: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
7020: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
7030: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
7040: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
7050: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
7060: 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
7070: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
7080: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73   /* Ignore terms
7090: 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72   with these prer
70a0: 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eqs */.  struct 
70b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
70c0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
70d0: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
70e0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
70f0: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
7100: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7110: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
7120: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
7130: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
7140: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
7150: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
7160: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7170: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
7180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7190: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
71a0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
71b0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
71c0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
71d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
71e0: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
71f0: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
7200: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
7210: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
7220: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
7230: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
7240: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
7250: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
7260: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
7270: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
7280: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
7290: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
72a0: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
72b0: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
72c0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
72d0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
72e0: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
72f0: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
7300: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
7310: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7320: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
7330: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7340: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7350: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7370: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7380: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
7390: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
73a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
73b0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
73c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
73d0: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
73e0: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
73f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7400: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
7410: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
7420: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7430: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
7440: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d  u.leftColumn>=(-
7450: 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  1) );.    nTerm+
7460: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
7470: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7480: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
7490: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
74a0: 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
74b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
74c0: 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
74d0: 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
74e0: 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
74f0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7500: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
7510: 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
7520: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
7530: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
7540: 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
7550: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
7560: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
7570: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
7580: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7590: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
75a0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
75b0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
75c0: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
75d0: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
75e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
75f0: 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
7600: 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
7610: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
7620: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7630: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7640: 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
7650: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7660: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
7670: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
7680: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
76b0: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
76c0: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
76f0: 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
7700: 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
7710: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
7720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7730: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
7740: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
7750: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7760: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
7770: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
7780: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
7790: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
77a0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
77b0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
77c0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
77d0: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
77e0: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
77f0: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
7800: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
7810: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
7820: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
7830: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
7840: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
7850: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
7860: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
7870: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7880: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
7890: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
78a0: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
78b0: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
78c0: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
78d0: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
78e0: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
78f0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7900: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
7910: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
7920: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7930: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
7940: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
7950: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
7960: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
7970: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
7980: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7990: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
79a0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
79b0: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
79c0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
79d0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
79e0: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
79f0: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
7a00: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7a10: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7a20: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
7a30: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7a40: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7a90: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
7aa0: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
7ab0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
7ac0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
7ad0: 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
7ae0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7af0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7b00: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7b10: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7b20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7b30: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7b40: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7b50: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7b60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b70: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7b80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7b90: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7ba0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7bb0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7bc0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
7bd0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7be0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7bf0: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
7c00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7c10: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7c20: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
7c30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
7c40: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
7c50: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
7c60: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
7c70: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7c80: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7c90: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
7ca0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7cb0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
7cc0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
7cd0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
7ce0: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
7cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
7d00: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
7d10: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
7d20: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
7d30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7d40: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
7d50: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
7d60: 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
7d70: 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
7d80: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
7d90: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
7db0: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
7dc0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
7dd0: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
7de0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7df0: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
7e00: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
7e10: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
7e20: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
7e30: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
7e40: 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
7e50: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7e60: 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
7e70: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
7e80: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
7e90: 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
7ea0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
7eb0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
7ec0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
7ed0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
7ee0: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
7ef0: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
7f00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7f10: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
7f20: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
7f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7f40: 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
7f50: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7f60: 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
7f70: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
7f80: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
7f90: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
7fa0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
7fb0: 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
7fc0: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
7fd0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
7fe0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7ff0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
8000: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8010: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
8020: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
8030: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
8040: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
8050: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8060: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
8070: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
8080: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
8090: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
80a0: 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
80b0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
80c0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
80d0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
80e0: 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
80f0: 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
8100: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
8110: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
8120: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
8130: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
8140: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
8150: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
8160: 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
8170: 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
8180: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8190: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
81a0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
81b0: 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
81c0: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
81d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
81e0: 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
81f0: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
8200: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
8210: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
8220: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
8230: 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
8240: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
8250: 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
8260: 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
8270: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
8280: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
8290: 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
82a0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
82b0: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
82c0: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
82d0: 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
82e0: 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
82f0: 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
8300: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
8310: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
8320: 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
8330: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
8340: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
8350: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8360: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
8370: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
8380: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
8390: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
83a0: 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
83b0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
83c0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
83d0: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
83e0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
83f0: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
8400: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
8410: 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
8420: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8430: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
8440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8450: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
8460: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
8470: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
8480: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
8490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
84a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
84b0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
84c0: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
84d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
84e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
84f0: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
8500: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
8510: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
8520: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
8530: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
8540: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
8550: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
8560: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
8570: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
8580: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
8590: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
85a0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
85b0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
85c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
85d0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
85e0: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
85f0: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8600: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8610: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8620: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8630: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
8640: 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
8650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8660: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8670: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
8680: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8690: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
86a0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
86b0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
86c0: 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
86d0: 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
86e0: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
86f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
8700: 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
8710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
8720: 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
8730: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
8740: 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20  ss than pRec.** 
8750: 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
8760: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8770: 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52  rows equal to pR
8780: 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ec.**.** Return 
8790: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
87a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
87b0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d  the smallest sam
87c0: 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67  ple that.** is g
87d0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
87e0: 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f  qual to pRec. No
87f0: 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  te that this ind
8800: 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64  ex is not an ind
8810: 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61  ex.** into the a
8820: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d  Sample[] array -
8830: 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20   it is an index 
8840: 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73  into a virtual s
8850: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  et of samples.**
8860: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
8870: 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c  ntents of aSampl
8880: 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  e[] and the numb
8890: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
88a0: 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e  record .** pRec.
88b0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
88c0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
88d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88f0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8900: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
8910: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
8920: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
8930: 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
8940: 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
8950: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
8960: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
8970: 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
8980: 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
8990: 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
89a0: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
89b0: 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
89c0: 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
89d0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
89e0: 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
89f0: 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
8a00: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
8a10: 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
8a20: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
8a30: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
8a40: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
8a50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8a60: 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
8a70: 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
8a80: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
8ab0: 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70  irst sample >= p
8ac0: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61  Rec */.  int iSa
8ad0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
8ae0: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
8af0: 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
8b00: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8b10: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  pRec */.  int iM
8b20: 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
8b30: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
8b40: 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
8b50: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
8b60: 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20   iTest;         
8b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
8b80: 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20   sample to test 
8b90: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
8bc0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
8bd0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  on */.  int nFie
8be0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
8bf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8c00: 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20   fields in pRec 
8c10: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  */.  tRowcnt iLo
8c20: 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wer = 0;        
8c30: 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45   /* anLt[] + anE
8c40: 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73  q[] of largest s
8c50: 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20  ample pRec is > 
8c60: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
8c70: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
8c80: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
8c90: 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
8ca0: 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
8cb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
8cc0: 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
8cd0: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
8ce0: 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63  nField>0 && pRec
8cf0: 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e  ->nField<=pIdx->
8d00: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20  nSampleCol );.. 
8d10: 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20   /* Do a binary 
8d20: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
8d30: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
8d40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
8d50: 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52  equal.  ** to pR
8d60: 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74  ec. If pRec cont
8d70: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69  ains a single fi
8d80: 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20  eld, the set of 
8d90: 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63  samples to searc
8da0: 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79  h.  ** is simply
8db0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
8dc0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d  rray. If the sam
8dd0: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
8de0: 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20  ] contain more. 
8df0: 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65   ** than one fie
8e00: 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20  lds, all fields 
8e10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
8e20: 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  rst are ignored.
8e30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52  .  **.  ** If pR
8e40: 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  ec contains N fi
8e50: 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73  elds, where N is
8e60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20   more than one, 
8e70: 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20  then as well as 
8e80: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73  the.  ** samples
8e90: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74   in aSample[] (t
8ea0: 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69  runcated to N fi
8eb0: 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63  elds), the searc
8ec0: 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20  h also has to.  
8ed0: 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66  ** consider pref
8ee0: 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61  ixes of those sa
8ef0: 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  mples. For examp
8f00: 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f  le, if the set o
8f10: 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69  f samples.  ** i
8f20: 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20  n aSample is:.  
8f30: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  **.  **     aSam
8f40: 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20  ple[0] = (a, 5) 
8f50: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8f60: 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a  e[1] = (a, 10) .
8f70: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
8f80: 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20  [2] = (b, 5) .  
8f90: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33  **     aSample[3
8fa0: 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20  ] = (c, 100) .  
8fb0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34  **     aSample[4
8fc0: 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a  ] = (c, 105).  *
8fd0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
8fe0: 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f  search space sho
8ff0: 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74  uld ideally be t
9000: 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65  he samples above
9010: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75   and the .  ** u
9020: 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b  nique prefixes [
9030: 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e  a], [b] and [c].
9040: 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20   But since that 
9050: 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e  is hard to organ
9060: 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63  ize, .  ** the c
9070: 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61  ode actually sea
9080: 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a  rches this set:.
9090: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a    **.  **     0:
90a0: 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31   (a) .  **     1
90b0: 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (a, 5) .  **  
90c0: 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20     2: (a, 10) . 
90d0: 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31   **     3: (a, 1
90e0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20  0) .  **     4: 
90f0: 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a  (b) .  **     5:
9100: 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
9110: 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20    6: (c) .  **  
9120: 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a     7: (c, 100) .
9130: 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20    **     8: (c, 
9140: 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a  105).  **     9:
9150: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
9160: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d   ** For each sam
9170: 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70  ple in the aSamp
9180: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61  le[] array, N sa
9190: 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  mples are presen
91a0: 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66  t in the.  ** ef
91b0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61  fective sample a
91c0: 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f  rray. In the abo
91d0: 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e  ve, samples 0 an
91e0: 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e  d 1 are based on
91f0: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53   .  ** sample aS
9200: 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65  ample[0]. Sample
9210: 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61  s 2 and 3 on aSa
9220: 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a  mple[1] etc..  *
9230: 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61  *.  ** Often, sa
9240: 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62  mple i of each b
9250: 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74  lock of N effect
9260: 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20  ive samples has 
9270: 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20  (i+1) fields..  
9280: 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20  ** Except, each 
9290: 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78  sample may be ex
92a0: 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65  tended to ensure
92b0: 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61   that it is grea
92c0: 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a  ter than or.  **
92d0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72   equal to the pr
92e0: 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e  evious sample in
92f0: 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20   the array. For 
9300: 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20  example, in the 
9310: 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d  above, .  ** sam
9320: 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72  ple 2 is the fir
9330: 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62  st sample of a b
9340: 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65  lock of N sample
9350: 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69  s, so at first i
9360: 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20  t .  ** appears 
9370: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62  that it should b
9380: 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a  e 1 field in siz
9390: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  e. However, that
93a0: 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a   would make it .
93b0: 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61    ** smaller tha
93c0: 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74  n sample 1, so t
93d0: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
93e0: 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e   would not work.
93f0: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20   As a result, . 
9400: 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64   ** it is extend
9410: 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73  ed to two fields
9420: 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73  . The duplicates
9430: 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74   that this creat
9440: 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20  es do not .  ** 
9450: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
9460: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c  ms..  */.  nFiel
9470: 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  d = pRec->nField
9480: 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ;.  iCol = 0;.  
9490: 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  iSample = pIdx->
94a0: 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64  nSample * nField
94b0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
94c0: 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iSamp;          
94d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
94e0: 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  ex in aSample[] 
94f0: 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  of test sample *
9500: 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  /.    int n;    
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9530: 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20   fields in test 
9540: 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  sample */..    i
9550: 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61  Test = (iMin+iSa
9560: 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61  mple)/2;.    iSa
9570: 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69  mp = iTest / nFi
9580: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61  eld;.    if( iSa
9590: 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mp>0 ){.      /*
95a0: 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66   The proposed ef
95b0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69  fective sample i
95c0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61  s a prefix of sa
95d0: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61  mple aSample[iSa
95e0: 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70  mp]..      ** Sp
95f0: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20  ecifically, the 
9600: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
9610: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b  of at least (1 +
9620: 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a   iTest%nField) .
9630: 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20        ** fields 
9640: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
9650: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
9660: 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  s effective samp
9670: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
9680: 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69  r(n=(iTest % nFi
9690: 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65  eld) + 1; n<nFie
96a0: 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; n++){.      
96b0: 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53    if( aSample[iS
96c0: 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  amp-1].anLt[n-1]
96d0: 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  !=aSample[iSamp]
96e0: 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65  .anLt[n-1] ) bre
96f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
9710: 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20   iTest + 1;.    
9720: 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  }..    pRec->nFi
9730: 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73  eld = n;.    res
9740: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
9750: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9760: 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53  ple[iSamp].n, aS
9770: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20  ample[iSamp].p, 
9780: 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
9790: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  es<0 ){.      iL
97a0: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
97b0: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
97c0: 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  + aSample[iSamp]
97d0: 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anEq[n-1];.    
97e0: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
97f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9800: 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65  res==0 && n<nFie
9810: 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  ld ){.      iLow
9820: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9830: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20  mp].anLt[n-1];. 
9840: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9850: 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  t+1;.      res =
9860: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
9870: 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
9880: 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f  iTest;.      iCo
9890: 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  l = n-1;.    }. 
98a0: 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
98b0: 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a  iMin<iSample );.
98c0: 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20    i = iSample / 
98d0: 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20  nField;..#ifdef 
98e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
98f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9900: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
9910: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
9920: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
9930: 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
9940: 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
9950: 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
9960: 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
9970: 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
9980: 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
9990: 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
99a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
99b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
99c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d   ){.    if( res=
99d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
99e0: 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
99f0: 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  ue, then pRec mu
9a00: 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  st be equal to s
9a10: 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20  ample i. */.    
9a20: 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
9a30: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
9a40: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
9a50: 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
9a60: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
9a70: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
9a80: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
9a90: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
9aa0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
9ab0: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
9ac0: 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20  pRec) .         
9ad0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9ae0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20  >mallocFailed . 
9af0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
9b00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65  e{.      /* Unle
9b10: 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  ss i==pIdx->nSam
9b20: 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ple, indicating 
9b30: 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72  that pRec is lar
9b40: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ger than.      *
9b50: 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  * all samples in
9b60: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9b70: 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20  rray, pRec must 
9b80: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
9b90: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43  the.      ** (iC
9ba0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
9bb0: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20  ix of sample i. 
9bc0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9bd0: 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i<=pIdx->nSamp
9be0: 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20  le && i>=0 );.  
9bf0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9c00: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20   = iCol+1;.     
9c10: 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
9c20: 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
9c30: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9c40: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9c50: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
9c60: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
9c70: 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  ec)>0.          
9c80: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9c90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9ca0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d  .      /* if i==
9cb0: 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74  0 and iCol==0, t
9cc0: 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20  hen record pRec 
9cd0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9ce0: 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20  all samples.    
9cf0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d    ** in the aSam
9d00: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68  ple[] array. Oth
9d10: 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c  erwise, if (iCol
9d20: 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75  >0) then pRec mu
9d30: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67  st.      ** be g
9d40: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9d50: 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f  qual to the (iCo
9d60: 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  l) field prefix 
9d70: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20  of sample i..   
9d80: 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20     ** If (i>0), 
9d90: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61  then pRec must a
9da0: 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74  lso be greater t
9db0: 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29  han sample (i-1)
9dc0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
9dd0: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
9de0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9df0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61   iCol;.        a
9e00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9e10: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9e20: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
9e30: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
9e40: 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )<=0.           
9e50: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9e60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9e80: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
9e90: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9ea0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20   nField;.       
9eb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ec0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9ed0: 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
9ee0: 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
9ef0: 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20  , pRec)<0.      
9f00: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9f10: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9f20: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
9f30: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
9f40: 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
9f50: 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72  EBUG */..  if( r
9f60: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
9f70: 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65  Record pRec is e
9f80: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
9f90: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9fa0: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
9fb0: 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
9fc0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
9fd0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
9fe0: 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
9ff0: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
a000: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74  }else{.    /* At
a010: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
a020: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
a030: 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c  prefix of aSampl
a040: 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
a050: 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  t .    ** sample
a060: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
a070: 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20   than pRec. Or, 
a080: 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
a090: 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20  ple then pRec.  
a0a0: 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74    ** is larger t
a0b0: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  han all samples 
a0c0: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f  in the array. */
a0d0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
a0e0: 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
a0f0: 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d  f( i>=pIdx->nSam
a100: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70  ple ){.      iUp
a110: 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
a120: 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
a130: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
a140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a150: 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
a160: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a170: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a180: 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
a190: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
a1a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a1b0: 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
a1c0: 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
a1d0: 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
a1e0: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
a1f0: 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
a200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
a210: 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
a220: 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
a230: 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
a240: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a250: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
a260: 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l];.  }..  /* Re
a270: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
a280: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
a290: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
a2a0: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
a2b0: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
a2c0: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
a2d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
a2e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a2f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
a300: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
a310: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
a320: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
a330: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
a340: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
a350: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
a360: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
a370: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
a380: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
a390: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
a3a0: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
a3b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a3c0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
a3d0: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
a3e0: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
a3f0: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
a400: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
a410: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
a420: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
a430: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
a440: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
a450: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
a460: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
a470: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
a480: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
a490: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
a4a0: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
a4b0: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
a4c0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
a4d0: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
a4e0: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
a4f0: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
a500: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
a510: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
a520: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
a530: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
a540: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
a550: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
a560: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
a570: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
a580: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
a590: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
a5a0: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
a5b0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
a5c0: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
a5d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
a5e0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
a5f0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
a600: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
a610: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
a620: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
a630: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
a640: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
a650: 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  Ret;.}...#ifdef 
a660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
a670: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
a680: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66  ** Return the af
a690: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e  finity for a sin
a6a0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  gle column of an
a6b0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
a6c0: 63 20 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e  c char sqlite3In
a6d0: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
a6e0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  y(sqlite3 *db, I
a6f0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
a700: 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28  iCol){.  assert(
a710: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
a720: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
a730: 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a  ;.  if( !pIdx->z
a740: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66  ColAff ){.    if
a750: 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  ( sqlite3IndexAf
a760: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49  finityStr(db, pI
a770: 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  dx)==0 ) return 
a780: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
a790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
a7a0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c  dx->zColAff[iCol
a7b0: 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  ];.}.#endif...#i
a7c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a7d0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
a7e0: 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
a7f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a800: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
a810: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
a820: 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
a830: 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
a840: 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
a850: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
a860: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
a870: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
a880: 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
a890: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
a8a0: 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
a8b0: 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
a8c0: 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
a8d0: 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
a8e0: 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
a8f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
a900: 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
a910: 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
a920: 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
a930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
a940: 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
a950: 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
a960: 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
a970: 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
a980: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
a990: 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
a9a0: 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
a9b0: 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
a9c0: 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
a9d0: 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
a9e0: 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
a9f0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
aa00: 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
aa10: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
aa20: 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
aa30: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
aa40: 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
aa50: 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
aa60: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
aa70: 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
aa80: 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
aa90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
aaa0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
aab0: 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
aac0: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
aad0: 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
aae0: 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
aaf0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ab00: 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
ab10: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
ab20: 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
ab30: 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
ab40: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
ab50: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
ab60: 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
ab70: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
ab80: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
ab90: 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
aba0: 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
abb0: 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
abc0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
abd0: 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
abe0: 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
abf0: 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
ac00: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
ac10: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
ac20: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
ac30: 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
ac40: 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
ac50: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
ac60: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
ac70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
ac80: 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
ac90: 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
aca0: 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
acb0: 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
acc0: 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
acd0: 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
ace0: 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
acf0: 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
ad00: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
ad10: 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
ad20: 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
ad30: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
ad40: 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
ad50: 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
ad60: 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
ad70: 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
ad80: 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
ad90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
ada0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
adb0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
adc0: 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
add0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
ade0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
adf0: 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
ae00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ae10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ae20: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
ae30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ae40: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
ae50: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
ae60: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
ae70: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
ae80: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
ae90: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
aea0: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
aeb0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
aec0: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
aed0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
aee0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
aef0: 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
af00: 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
af10: 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
af20: 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
af30: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
af40: 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
af50: 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
af60: 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
af70: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
af80: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
af90: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
afa0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
afb0: 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
afc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
afd0: 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
afe0: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
aff0: 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
b000: 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
b010: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66  LITE_OK;.  u8 af
b020: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
b030: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64  ColumnAffinity(d
b040: 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f  b, p, nEq);.  Co
b050: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
b060: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b070: 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
b080: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
b090: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
b0a0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
b0b0: 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
b0c0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b0d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
b0e0: 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
b0f0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
b100: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
b110: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
b120: 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
b130: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
b140: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
b150: 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
b160: 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
b170: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
b180: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
b190: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
b1a0: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
b1b0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
b1c0: 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
b1d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
b1e0: 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
b1f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
b200: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
b210: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
b220: 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
b230: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
b240: 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
b250: 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
b260: 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
b270: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
b280: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
b290: 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
b2a0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
b2b0: 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
b2c0: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
b2d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
b2e0: 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
b2f0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
b300: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
b310: 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
b320: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b330: 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
b340: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
b350: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
b360: 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
b370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
b380: 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
b390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b3a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b3b0: 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
b3c0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
b3d0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
b3e0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
b3f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
b400: 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
b410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b420: 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
b430: 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
b440: 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
b450: 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
b460: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
b470: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
b480: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
b490: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
b4a0: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
b4b0: 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
b4c0: 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
b4d0: 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
b4e0: 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
b4f0: 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
b500: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
b510: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
b520: 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
b530: 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
b540: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b550: 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
b560: 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
b570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b580: 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
b590: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
b5a0: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
b5b0: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
b5c0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
b5d0: 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
b5e0: 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
b5f0: 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
b600: 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
b610: 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
b620: 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
b630: 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
b640: 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
b650: 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
b660: 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
b670: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
b680: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
b690: 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
b6a0: 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
b6b0: 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
b6c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
b6f0: 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
b700: 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
b710: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
b720: 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
b730: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
b740: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
b750: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
b760: 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
b770: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
b780: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
b790: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b7a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
b7b0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
b7c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b7d0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
b7e0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
b7f0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
b800: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
b810: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
b820: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
b830: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
b840: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
b850: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
b860: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
b870: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
b880: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
b890: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
b8a0: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
b8b0: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
b8c0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
b8d0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
b8e0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
b8f0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
b900: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
b910: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
b920: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
b930: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
b940: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
b970: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b990: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
b9c0: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
b9d0: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
b9e0: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
b9f0: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
ba00: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
ba10: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
ba20: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
ba30: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
ba40: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
ba50: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
ba60: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
ba70: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ba80: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
ba90: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
baa0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
bab0: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
bac0: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
bad0: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
bae0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
baf0: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
bb00: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
bb10: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
bb20: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
bb30: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
bb40: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
bb50: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
bb60: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
bb70: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
bb80: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
bb90: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
bba0: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
bbb0: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
bbc0: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
bbd0: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
bbe0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
bbf0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
bc00: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
bc10: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
bc20: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
bc30: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
bc40: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
bc50: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
bc60: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
bc70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
bc80: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
bc90: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
bca0: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
bcb0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
bcc0: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
bcd0: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
bce0: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
bcf0: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
bd00: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
bd10: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
bd20: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
bd30: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
bd40: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
bd50: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
bd60: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
bd70: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
bd80: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
bd90: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
bda0: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
bdb0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
bdc0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
bdd0: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
bde0: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
bdf0: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
be00: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
be10: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
be20: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
be30: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
be40: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
be50: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
be60: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
be70: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
be80: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
be90: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
bea0: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
beb0: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
bec0: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
bed0: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
bee0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
bef0: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
bf00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bf10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
bf20: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
bf30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
bf40: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
bf50: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
bf60: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
bf70: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
bf80: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
bf90: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
bfa0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
bfb0: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
bfc0: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
bfd0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
bfe0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
bff0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
c000: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
c010: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
c020: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
c030: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
c040: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c050: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
c060: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
c070: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
c080: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c090: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
c0a0: 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
c0b0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
c0c0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
c0d0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
c0e0: 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
c0f0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
c100: 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
c110: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  ol ){.    if( nE
c120: 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
c130: 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
c140: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
c150: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
c160: 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
c170: 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
c180: 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20   u8 aff;..      
c190: 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
c1a0: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
c1b0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
c1c0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
c1d0: 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  rows in .      *
c1e0: 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
c1f0: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
c200: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
c210: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
c220: 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  y. The.      ** 
c230: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
c240: 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
c250: 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
c260: 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
c270: 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70  e.      ** key-p
c280: 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
c290: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
c2a0: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
c2b0: 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
c2c0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
c2d0: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
c2e0: 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61  and $L is the va
c2f0: 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20  lue in pLower.. 
c300: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c310: 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
c320: 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
c330: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
c340: 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
c350: 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  e it.      ** is
c360: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
c370: 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
c380: 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
c390: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
c3a0: 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
c3b0: 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
c3c0: 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
c3d0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c3e0: 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
c3f0: 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
c400: 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
c410: 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
c420: 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
c430: 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  ) and .      ** 
c440: 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
c450: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
c460: 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
c470: 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  s is used..     
c480: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d   **.      ** Sim
c490: 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
c4a0: 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
c4b0: 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
c4c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
c4d0: 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
c4e0: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
c4f0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
c500: 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
c510: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
c520: 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
c530: 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
c540: 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
c550: 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
c560: 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
c570: 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65       ** of iUppe
c580: 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
c590: 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
c5a0: 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
c5b0: 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  er used..      *
c5c0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
c5d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65  umber of rows be
c5e0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f  tween the two bo
c5f0: 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73  unds is then jus
c600: 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e  t iUpper-iLower.
c610: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c620: 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20  tRowcnt iLower; 
c630: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
c640: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c650: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74  bound */.      t
c660: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20  Rowcnt iUpper;  
c670: 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
c680: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
c690: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
c6a0: 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20  t iLwrIdx = -2; 
c6b0: 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
c6c0: 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  or the lower bou
c6d0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
c6e0: 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20  iUprIdx = -1;   
c6f0: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
c700: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c710: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70   */..      if( p
c720: 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rec ){.        t
c730: 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e  estcase( pRec->n
c740: 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d  Field!=pBuilder-
c750: 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  >nRecValid );.  
c760: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
c770: 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ld = pBuilder->n
c780: 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  RecValid;.      
c790: 7d 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  }.      aff = sq
c7a0: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
c7b0: 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2d  Affinity(pParse-
c7c0: 3e 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20  >db, p, nEq);.  
c7d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 21      assert( nEq!
c7e0: 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 61  =p->nKeyCol || a
c7f0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
c800: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
c810: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
c820: 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
c830: 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
c840: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  */.      if( nEq
c850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
c860: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
c870: 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e     iUpper = p->n
c880: 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d  RowEst0;.      }
c890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c8a0: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
c8b0: 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
c8c0: 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
c8d0: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
c8e0: 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a   must .        *
c8f0: 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  * have been requ
c900: 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69  ested when testi
c910: 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65  ng key $P in whe
c920: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29  reEqualScanEst()
c930: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
c940: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
c950: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
c960: 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77  a);.        iLow
c970: 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
c980: 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
c990: 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   + a[1];.      }
c9a0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
c9b0: 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c  pLower==0 || (pL
c9c0: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
c9d0: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
c9e0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
c9f0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
ca00: 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  | (pUpper->eOper
ca10: 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
ca20: 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
ca30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f    assert( p->aSo
ca40: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
ca50: 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74      if( p->aSort
ca60: 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20  Order[nEq] ){.  
ca70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c        /* The rol
ca80: 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64  es of pLower and
ca90: 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70   pUpper are swap
caa0: 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69  ped for a DESC i
cab0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
cac0: 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c  SWAP(WhereTerm*,
cad0: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29   pLower, pUpper)
cae0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
caf0: 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
cb00: 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
cb10: 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20  iLower estimate 
cb20: 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a  using ($P:$L). *
cb30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77  /.      if( pLow
cb40: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
cb50: 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
cb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb70: 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
cb80: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
cb90: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
cba0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
cbb0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
cbc0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
cbd0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
cbe0: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
cbf0: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
cc00: 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
cc10: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
cc20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cc30: 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
cc40: 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
cc50: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
cc60: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
cc70: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
cc80: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
cc90: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
cca0: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
ccb0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
ccc0: 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20  O_LE)) ? a[1] : 
ccd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
cce0: 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20  ( iNew>iLower ) 
ccf0: 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iLower = iNew;. 
cd00: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
cd10: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65  .          pLowe
cd20: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
cd30: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cd40: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
cd50: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
cd60: 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75  Upper estimate u
cd70: 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f  sing ($P:$U). */
cd80: 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65  .      if( pUppe
cd90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
cda0: 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
cdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cdc0: 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
cdd0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
cde0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
cdf0: 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65  r *pExpr = pUppe
ce00: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
ce10: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
ce20: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
ce30: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
ce40: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
ce50: 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b  , aff, nEq, &bOk
ce60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ce70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ce80: 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bOk ){.         
ce90: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
cea0: 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78           iUprIdx
ceb0: 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
cec0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
ced0: 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 1, a);.       
cee0: 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b     iNew = a[0] +
cef0: 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72   ((pUpper->eOper
cf00: 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
cf10: 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30  _LE)) ? a[1] : 0
cf20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
cf30: 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69   iNew<iUpper ) i
cf40: 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Upper = iNew;.  
cf50: 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a          nOut--;.
cf60: 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65 72            pUpper
cf70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
cf80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
cf90: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
cfa0: 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20  pRec;.      if( 
cfb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
cfc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55 70  .        if( iUp
cfd0: 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20  per>iLower ){.  
cfe0: 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
cff0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
d000: 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
d010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
d020: 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55 70  NG:  If both iUp
d030: 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20 61  per and iLower a
d040: 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  re derived from 
d050: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
d060: 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68     ** sample, th
d070: 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20 61  en assume they a
d080: 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65 63  re 4x more selec
d090: 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69 6e  tive.  This brin
d0a0: 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gs.          ** 
d0b0: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73 65  the estimated se
d0c0: 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20 69  lectivity more i
d0d0: 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61 74  n line with what
d0e0: 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 20   it would be.   
d0f0: 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73 74         ** if est
d100: 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20 74  imated without t
d110: 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33 2f  he use of STAT3/
d120: 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20  4 tables. */.   
d130: 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72 49         if( iLwrI
d140: 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e 4e  dx==iUprIdx ) nN
d150: 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65 72  ew -= 20;  asser
d160: 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
d170: 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 20  gEst(4) );.     
d180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d190: 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
d1a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
d1b0: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
d1c0: 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2) );.        }.
d1d0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77          if( nNew
d1e0: 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  <nOut ){.       
d1f0: 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a     nOut = nNew;.
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
d220: 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65  0, ("STAT4 range
d230: 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65   scan: %u..%u  e
d240: 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
d270: 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
d280: 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Out));.      }. 
d290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d2a0: 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20  int bDone = 0;. 
d2b0: 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
d2c0: 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
d2d0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20  pParse, pLower, 
d2e0: 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26  pUpper, pLoop, &
d2f0: 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  bDone);.      if
d300: 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  ( bDone ) return
d310: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
d320: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
d330: 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
d340: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d350: 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20  TER(pBuilder);. 
d360: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
d370: 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e  || pUpper );.#en
d380: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55  dif.  assert( pU
d390: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
d3a0: 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
d3b0: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
d3c0: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d3d0: 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72  ngeAdjust(pLower
d3e0: 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20  , nOut);.  nNew 
d3f0: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
d400: 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29  st(pUpper, nNew)
d410: 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ;..  /* TUNING: 
d420: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
d430: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
d440: 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65  wer limit and ne
d450: 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a  ither limit.  **
d460: 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61 74   has an applicat
d470: 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65  ion-defined like
d480: 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65  lihood(), assume
d490: 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20   the range is.  
d4a0: 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61 6e  ** reduced by an
d4b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e   additional 75%.
d4c0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
d4d0: 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e  , by default, an
d4e0: 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a   open-ended.  **
d4f0: 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e   range query (e.
d500: 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61  g. col > ?) is a
d510: 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20  ssumed to match 
d520: 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20  1/4 of the rows 
d530: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
d540: 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65  x. While a close
d550: 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f  d range (e.g. co
d560: 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
d570: 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  ?) is estimated 
d580: 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f  to.  ** match 1/
d590: 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  64 of the index.
d5a0: 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65   */ .  if( pLowe
d5b0: 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75  r && pLower->tru
d5c0: 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70 70  thProb>0 && pUpp
d5d0: 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74 72  er && pUpper->tr
d5e0: 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20  uthProb>0 ){.   
d5f0: 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d   nNew -= 20;.  }
d600: 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f  ..  nOut -= (pLo
d610: 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65  wer!=0) + (pUppe
d620: 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65  r!=0);.  if( nNe
d630: 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30  w<10 ) nNew = 10
d640: 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75  ;.  if( nNew<nOu
d650: 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b  t ) nOut = nNew;
d660: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
d670: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d680: 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f  .  if( pLoop->nO
d690: 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57  ut>nOut ){.    W
d6a0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
d6b0: 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65  "Range scan lowe
d6c0: 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20  rs nOut from %d 
d6d0: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
d6f0: 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29  oop->nOut, nOut)
d700: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
d710: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
d720: 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
d730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
d740: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d750: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
d760: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
d780: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
d790: 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
d7a0: 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
d7b0: 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
d7c0: 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
d7d0: 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
d7e0: 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
d7f0: 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
d800: 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
d810: 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
d820: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
d830: 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
d840: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
d850: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
d860: 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
d870: 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
d880: 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
d890: 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
d8a0: 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
d8b0: 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
d8c0: 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
d8d0: 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
d8e0: 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
d8f0: 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
d900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d910: 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
d920: 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
d930: 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
d940: 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
d950: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
d960: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
d970: 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
d980: 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
d990: 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
d9a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
d9b0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
d9c0: 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
d9d0: 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
d9e0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
d9f0: 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
da00: 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
da10: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
da20: 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
da30: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
da40: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
da50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
da60: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
da70: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
da80: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
da90: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
daa0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
dab0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
dac0: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
dad0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
dae0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
daf0: 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
db00: 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
db10: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
db20: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
db30: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
db40: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
db50: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
db60: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
db70: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
db80: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
db90: 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
dba0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
dbb0: 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
dbc0: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
dbd0: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
dbe0: 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
dbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
dc00: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
dc10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc30: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
dc40: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
dc50: 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
dc60: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
dc70: 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
dc80: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
dc90: 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
dca0: 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d  ( nEq<=p->nColum
dcb0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
dcc0: 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
dcd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
dce0: 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
dcf0: 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
dd00: 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a  ecValid<nEq );..
dd10: 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61    /* If values a
dd20: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
dd30: 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20   for all fields 
dd40: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
dd50: 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
dd60: 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73   this one, no es
dd70: 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61  timate can be ma
dd80: 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  de. Return SQLIT
dd90: 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20  E_NOTFOUND. */. 
dda0: 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e   if( pBuilder->n
ddb0: 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29  RecValid<(nEq-1)
ddc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ddd0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
dde0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
ddf0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
de00: 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c  n only. The call
de10: 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34   to sqlite3Stat4
de20: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a  ProbeSetValue().
de30: 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64    ** below would
de40: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
de50: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
de60: 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d  ( nEq>=p->nColum
de70: 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  n ){.    *pnRow 
de80: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
de90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
dea0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49    aff = sqlite3I
deb0: 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ndexColumnAffini
dec0: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
ded0: 2c 20 6e 45 71 2d 31 29 3b 0a 20 20 72 63 20 3d  , nEq-1);.  rc =
dee0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
def0: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
df00: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
df10: 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
df20: 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
df30: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
df40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
df50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
df60: 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
df70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
df80: 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
df90: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
dfa0: 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
dfb0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
dfc0: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
dfd0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
dfe0: 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
dff0: 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
e000: 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
e010: 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
e020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e030: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e040: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
e050: 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
e060: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e070: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
e080: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
e090: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
e0a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
e0b0: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
e0c0: 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
e0d0: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
e0e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
e0f0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
e100: 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
e110: 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
e120: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
e130: 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
e140: 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
e150: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
e160: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
e170: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
e180: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
e190: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
e1a0: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
e1b0: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
e1c0: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
e1d0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
e1e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e1f0: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
e200: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
e210: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e220: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
e230: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
e240: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
e250: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
e260: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
e270: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
e280: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
e290: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
e2a0: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
e2b0: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
e2c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
e2d0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
e2e0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
e2f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e300: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
e310: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
e320: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
e330: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
e340: 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
e350: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
e360: 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
e370: 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
e380: 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
e390: 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
e3a0: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
e3b0: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
e3c0: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
e3d0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
e3e0: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
e3f0: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
e400: 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
e410: 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
e420: 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
e430: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
e440: 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
e450: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e460: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
e470: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
e480: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
e490: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
e4a0: 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
e4b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e4c0: 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
e4d0: 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
e4e0: 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
e4f0: 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
e500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
e510: 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
e520: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e540: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e550: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
e560: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
e570: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e580: 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
e590: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
e5a0: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
e5b0: 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
e5c0: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
e5d0: 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
e5e0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
e5f0: 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
e600: 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
e610: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
e620: 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
e630: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
e640: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
e650: 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
e660: 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
e670: 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
e680: 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
e690: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
e6a0: 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
e6b0: 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f  : est=%d\n", nRo
e6c0: 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
e6d0: 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
e6e0: 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
e6f0: 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
e700: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
e710: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
e720: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
e730: 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
e740: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
e750: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e  ** Print the con
e760: 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54  tent of a WhereT
e770: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  erm object.*/.st
e780: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54  atic void whereT
e790: 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65  ermPrint(WhereTe
e7a0: 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69  rm *pTerm, int i
e7b0: 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
e7c0: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rm==0 ){.    sql
e7d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e7e0: 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c  "TERM-%-3d NULL\
e7f0: 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65  n", iTerm);.  }e
e800: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  lse{.    char zT
e810: 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  ype[4];.    memc
e820: 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
e830: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   4);.    if( pTe
e840: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
e850: 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
e860: 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20  pe[0] = 'V';.   
e870: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
e880: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
e890: 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
e8a0: 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  E';.    if( Expr
e8b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
e8c0: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
e8d0: 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
e8e0: 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c  ] = 'L';.    sql
e8f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e900: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
e910: 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d  3d %p %s cursor=
e920: 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f  %-3d prob=%-3d o
e930: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
e940: 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20 20  =0x%04x\n",.    
e950: 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c     iTerm, pTerm,
e960: 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c   zType, pTerm->l
e970: 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d  eftCursor, pTerm
e980: 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
e990: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
e9a0: 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46  ator, pTerm->wtF
e9b0: 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lags);.    sqlit
e9c0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
e9d0: 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
e9e0: 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  0);.  }.}.#endif
e9f0: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
ea00: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
ea10: 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
ea20: 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
ea30: 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
ea40: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
ea50: 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
ea60: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
ea70: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
ea80: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
ea90: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
eaa0: 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
eab0: 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
eac0: 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
ead0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
eae0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
eaf0: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
eb00: 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
eb10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
eb20: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
eb30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
eb40: 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
eb50: 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
eb80: 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
eb90: 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
eba0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ebb0: 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
ebe0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
ebf0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ec00: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
ec10: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
ec20: 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
ec30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ec40: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
ec50: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
ec60: 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
ec70: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
ec80: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
ec90: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
eca0: 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
ecb0: 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
ecc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
ecd0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ece0: 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
ecf0: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
ed00: 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
ed10: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
ed20: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
ed30: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ed40: 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
ed50: 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
ed60: 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
ed70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
ed80: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ed90: 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
eda0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
edb0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
edc0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
edd0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
ede0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
edf0: 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
ee20: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
ee30: 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
ee40: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
ee50: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
ee60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
ee70: 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
ee80: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
ee90: 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
eea0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
eeb0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
eec0: 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
eed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
eee0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
eef0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
ef00: 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
ef10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ef20: 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
ef30: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
ef40: 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
ef50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ef60: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ef70: 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
ef80: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
ef90: 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
efa0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
efb0: 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
efc0: 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
efd0: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
efe0: 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
eff0: 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
f000: 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
f010: 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
f020: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f030: 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
f040: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
f050: 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
f060: 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
f070: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
f080: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
f090: 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
f0a0: 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
f0b0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
f0c0: 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
f0d0: 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
f0e0: 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
f0f0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
f100: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
f110: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
f120: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
f130: 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
f140: 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
f150: 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
f160: 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
f170: 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
f180: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
f190: 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
f1a0: 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
f1b0: 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
f1c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f1d0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
f1e0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
f1f0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f200: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
f210: 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
f220: 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
f230: 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
f240: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
f250: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
f260: 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
f270: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
f280: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f290: 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
f2a0: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
f2b0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
f2c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
f2d0: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
f2e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f2f0: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
f300: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
f310: 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
f320: 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
f330: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f340: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
f350: 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
f360: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f370: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
f380: 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
f390: 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
f3a0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
f3b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
f3c0: 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
f3d0: 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
f3e0: 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
f3f0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f400: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
f410: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
f420: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
f430: 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
f440: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
f450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f460: 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
f470: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
f480: 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
f490: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
f4a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
f4b0: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
f4c0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
f4d0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
f4e0: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
f4f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
f500: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
f510: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f520: 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
f530: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
f540: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
f550: 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
f560: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
f570: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
f580: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
f590: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
f5a0: 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
f5b0: 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
f5c0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
f5d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
f5e0: 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
f5f0: 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
f600: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
f610: 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
f620: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
f630: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
f640: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
f650: 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
f660: 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
f670: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
f680: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
f6a0: 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
f6b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
f6c0: 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
f6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f6e0: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
f6f0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f700: 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
f710: 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
f720: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
f730: 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
f740: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
f750: 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
f760: 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
f770: 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
f780: 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
f790: 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
f7a0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f7b0: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
f7c0: 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
f7d0: 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
f7e0: 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
f7f0: 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
f800: 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
f810: 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
f820: 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
f830: 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
f840: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
f850: 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
f860: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
f870: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
f880: 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
f890: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
f8a0: 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
f8b0: 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
f8c0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
f8d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
f8f0: 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
f900: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f910: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
f920: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
f930: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f940: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
f950: 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
f960: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
f970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
f980: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
f990: 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
f9a0: 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
f9b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
f9c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f9d0: 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
f9e0: 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
f9f0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
fa00: 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
fa10: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
fa20: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
fa30: 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
fa40: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
fa50: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26  Level->pWLoop &&
fa60: 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
fa70: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
fa80: 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20  E_IN_ABLE) ){.  
fa90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
faa0: 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
fab0: 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
fac0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fad0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
fae0: 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
faf0: 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
fb00: 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
fb10: 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
fb20: 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
fb30: 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
fb40: 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
fb50: 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
fb60: 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
fb70: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
fb80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
fb90: 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
fba0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
fbb0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c  eturn TRUE if al
fbc0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
fbd0: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
fbe0: 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20  **   (1)  X has 
fbf0: 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
fc00: 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a  r cost that Y.**
fc10: 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70     (2)  X is a p
fc20: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
fc30: 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b  Y.**   (3)  X sk
fc40: 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20  ips at least as 
fc50: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20  many columns as 
fc60: 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70  Y.**.** By "prop
fc70: 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65  er subset" we me
fc80: 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66  an that X uses f
fc90: 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ewer WHERE claus
fca0: 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20  e terms.** than 
fcb0: 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
fcc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
fcd0: 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
fce0: 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20  also used.** by 
fcf0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  Y..**.** If X is
fd00: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
fd10: 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
fd20: 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
fd30: 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
fd40: 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
fd50: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
fd60: 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
fd70: 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
fd80: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
fd90: 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
fda0: 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
fdb0: 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72  ed.  The third r
fdc0: 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  ule.** was added
fdd0: 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
fde0: 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
fdf0: 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
fe00: 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
fe10: 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
fe20: 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
fe30: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
fe40: 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   Y..*/.static in
fe50: 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  t whereLoopCheap
fe60: 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a  erProperSubset(.
fe70: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
fe80: 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20  p *pX,       /* 
fe90: 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  First WhereLoop 
fea0: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
feb0: 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
fec0: 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *pY        /* Co
fed0: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68  mpare against th
fee0: 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  is WhereLoop */.
fef0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
ff00: 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d   if( pX->nLTerm-
ff10: 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d  pX->nSkip >= pY-
ff20: 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69  >nLTerm-pY->nSki
ff30: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
ff40: 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61  0; /* X is not a
ff50: 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a   subset of Y */.
ff60: 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53    }.  if( pY->nS
ff70: 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20  kip > pX->nSkip 
ff80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ff90: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59  ( pX->rRun >= pY
ffa0: 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66  ->rRun ){.    if
ffb0: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d  ( pX->rRun > pY-
ffc0: 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30  >rRun ) return 0
ffd0: 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
ffe0: 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
fff0: 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20     if( pX->nOut 
10000 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74  > pY->nOut ) ret
10010 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
10020 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
10030 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   */.  }.  for(i=
10040 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e  pX->nLTerm-1; i>
10050 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
10060 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  ( pX->aLTerm[i]=
10070 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10080 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54     for(j=pY->nLT
10090 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
100a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d  ){.      if( pY-
100b0 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e  >aLTerm[j]==pX->
100c0 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61  aLTerm[i] ) brea
100d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
100e0 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b   j<0 ) return 0;
100f0 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62    /* X not a sub
10100 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74  set of Y since t
10110 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65  erm X[i] not use
10120 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  d by Y */.  }.  
10130 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
10140 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
10150 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
10160 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
10170 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
10180 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
10190 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
101a0 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
101b0 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
101c0 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
101d0 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
101e0 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
101f0 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
10200 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
10210 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
10220 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
10230 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
10240 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
10250 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
10260 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
10270 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10280 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
10290 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
102a0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
102b0 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
102c0 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
102d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
102e0 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
102f0 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
10300 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
10310 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
10320 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
10330 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10340 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
10350 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10360 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
10370 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
10380 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
10390 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
103a0 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
103b0 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
103c0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
103d0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
103e0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
103f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
10400 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
10410 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
10420 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10430 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
10440 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10450 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
10460 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
10470 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
10480 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
10490 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
104a0 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
104b0 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
104c0 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
104d0 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
104e0 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
104f0 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
10500 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10510 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
10520 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
10530 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
10540 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
10550 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
10560 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
10570 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
10580 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
10590 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
105a0 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
105b0 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
105c0 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
105d0 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
105e0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
105f0 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
10600 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
10610 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
10620 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
10630 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
10640 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
10650 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
10660 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
10670 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
10680 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
106b0 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
106c0 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
106d0 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
106e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
106f0 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
10700 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10710 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
10720 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
10730 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
10740 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
10750 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
10760 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
10770 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
10780 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54  supplanted by pT
10790 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  emplate..**.** R
107a0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
107b0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74  e WhereLoop list
107c0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74   contains an ent
107d0 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70  ry that can supp
107e0 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74  lant.** pTemplat
107f0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
10800 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64  s if pTemplate d
10810 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f  oes not belong o
10820 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
10830 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
10840 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
10850 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61  plate can suppla
10860 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  nt, then return 
10870 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
10880 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
10890 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
108a0 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e  e cannot supplan
108b0 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  t any existing e
108c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
108d0 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20  st but needs.** 
108e0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
108f0 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65  he list, then re
10900 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
10910 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  o the tail of th
10920 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
10930 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
10940 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
10950 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
10960 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
10970 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
10980 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
10990 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
109a0 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
109b0 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
109c0 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
109d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
109e0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
109f0 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
10a00 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
10a10 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
10a20 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
10a30 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
10a40 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
10a50 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
10a60 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
10a70 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
10a80 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
10a90 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
10aa0 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
10ab0 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
10ac0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
10ad0 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
10ae0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
10af0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
10b00 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
10b10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
10b20 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
10b30 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
10b40 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
10b50 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
10b60 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
10b70 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
10b80 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
10b90 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
10ba0 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
10bb0 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
10bc0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
10bd0 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
10be0 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
10bf0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
10c00 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
10c10 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
10c20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
10c30 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
10c40 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
10c50 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
10c60 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
10c70 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
10c80 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
10c90 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
10ca0 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
10cb0 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
10cc0 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
10cd0 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
10ce0 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
10cf0 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
10d00 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
10d10 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
10d20 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
10d30 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
10d40 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
10d50 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
10d60 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
10d70 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
10d80 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
10d90 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
10da0 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
10db0 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
10dc0 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
10dd0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
10de0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10df0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
10e00 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10e10 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
10e20 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10e30 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10e40 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
10e50 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10e60 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10e70 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
10e80 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
10e90 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
10ea0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
10eb0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
10ec0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
10ed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10ee0 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
10ef0 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
10f00 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
10f10 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
10f20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
10f30 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
10f40 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
10f50 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
10f60 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
10f70 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
10f80 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
10f90 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
10fa0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
10fb0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
10fc0 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
10fd0 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
10fe0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
10ff0 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
11000 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
11010 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
11020 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
11030 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
11040 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
11050 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
11060 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
11090 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
110a0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
110b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
110c0 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
110d0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
110e0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
110f0 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
11100 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
11110 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
11120 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
11130 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
11140 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
11150 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
11160 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
11170 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
11180 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
11190 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
111a0 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
111b0 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
111c0 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
111d0 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
111e0 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
111f0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
11200 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
11210 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
11220 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
11230 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
11240 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
11250 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
11260 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
11270 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11290 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
112a0 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
112b0 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
112e0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
112f0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
11300 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
11310 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
11320 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
11330 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
11340 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
11350 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
11360 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
11370 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11380 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
11390 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
113a0 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
113b0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
113c0 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
113d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
113e0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
113f0 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
11400 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
11410 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
11420 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
11430 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
11440 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
11450 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
11460 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
11470 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
11480 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
11490 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
114a0 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
114b0 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
114c0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
114d0 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
114e0 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
114f0 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
11500 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
11510 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
11520 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11530 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
11540 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
11550 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
11560 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
11570 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
11580 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
11590 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
115a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
115b0 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
115c0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
115d0 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
115e0 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
115f0 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
11600 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
11610 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
11620 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
11630 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
11640 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
11650 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
11660 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
11670 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
11680 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
11690 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
116a0 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
116b0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
116c0 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
116d0 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
116e0 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
116f0 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
11700 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
11710 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
11720 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
11730 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
11740 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11750 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
11760 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
11770 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
11780 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
11790 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
117a0 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
117b0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
117c0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
117d0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
117e0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
117f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11800 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
11810 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11820 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
11830 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
11840 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
11850 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
11860 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
11870 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
11880 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
11890 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
118a0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
118b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
118c0 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
118d0 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
118e0 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
118f0 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
11900 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
11910 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
11920 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
11930 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b  plate->nLTerm ){
11940 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11950 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31  ENABLED.      u1
11960 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
11970 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20  pOrSet->n;.     
11980 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
11990 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
119a0 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f  ert(pBuilder->pO
119b0 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rSet, pTemplate-
119c0 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61  >prereq, pTempla
119d0 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20  te->rRun,.      
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
11a00 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a  emplate->nOut);.
11a10 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11a20 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
11a30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11a40 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
11a50 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
11a60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11a70 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
11a80 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
11a90 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
11aa0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
11ab0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
11ac0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
11ad0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  dif.    }.    re
11ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11af0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
11b00 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
11b10 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
11b20 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
11b30 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
11b40 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
11b50 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
11b60 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
11b70 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
11b80 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
11b90 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
11ba0 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
11bb0 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
11bc0 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
11bd0 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
11be0 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
11bf0 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
11c00 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
11c10 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
11c20 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
11c30 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11c40 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
11c50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11c60 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
11c70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11c80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11c90 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
11ca0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
11cb0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
11cc0 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
11cd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
11cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
11d00 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
11d10 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
11d20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
11d30 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
11d40 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
11d50 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
11d60 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
11d70 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
11d80 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
11d90 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
11da0 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
11db0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
11dc0 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
11dd0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
11de0 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
11df0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
11e00 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
11e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11e20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
11e30 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
11e40 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11e50 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
11e60 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WC);.    }.    s
11e70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
11e80 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a  f("    add: ");.
11e90 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11ea0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
11eb0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
11ec0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
11ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  ==0 ){.    /* Al
11ee0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
11ef0 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f  reLoop to add to
11f00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11f10 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50  list */.    *ppP
11f20 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  rev = p = sqlite
11f30 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
11f40 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
11f50 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
11f60 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
11f70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
11f80 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
11f90 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
11fa0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11fb0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
11fc0 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
11fd0 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
11fe0 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
11ff0 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
12000 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
12010 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
12020 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
12030 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
12040 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
12050 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
12060 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
12070 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
12080 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
12090 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
120a0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
120b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
120c0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
120d0 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
120e0 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
120f0 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
12100 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
12110 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12120 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
12130 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
12140 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
12150 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
12160 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
12170 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
12180 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
12190 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
121a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
121b0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
121c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
121d0 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
121e0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
121f0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
12200 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12210 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
12220 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
12230 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
12240 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
12250 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
12260 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
12270 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
12280 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
12290 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
122a0 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
122b0 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
122c0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
122d0 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
122e0 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
122f0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
12300 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
12310 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
12330 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
12340 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
12350 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
12360 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
12370 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
12380 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
12390 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
123a0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
123b0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
123c0 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
123d0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
123e0 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
123f0 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
12400 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
12410 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
12420 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
12430 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
12440 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
12450 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
12460 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
12470 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
12480 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
12490 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
124a0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
124b0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
124c0 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
124d0 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
124e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
124f0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
12500 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
12510 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
12520 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
12530 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
12540 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
12550 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
12560 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
12570 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
12580 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12590 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
125a0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
125b0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
125c0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
125d0 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
125e0 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
125f0 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
12600 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
12610 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12620 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
12630 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
12640 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
12650 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
12660 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
12670 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
12680 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
12690 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
126a0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
126b0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
126c0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
126d0 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
126e0 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
126f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12700 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
12710 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
12720 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
12730 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
12740 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
12750 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
12760 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
12770 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
12780 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
12790 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
127a0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
127b0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
127c0 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
127d0 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
127e0 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
127f0 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
12800 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
12810 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
12820 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
12830 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
12840 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
12850 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
12860 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
12870 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
12880 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
12890 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
128a0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
128b0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
128c0 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
128d0 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
128e0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
128f0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
12900 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
12910 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
12920 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12930 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
12940 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
12950 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
12960 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
12970 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
12980 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12990 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
129a0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
129b0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
129c0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
129d0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
129e0 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
129f0 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
12a00 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
12a10 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
12a20 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
12a30 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
12a40 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
12a50 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
12a60 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
12a70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
12a80 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
12a90 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
12aa0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
12ab0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
12ac0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
12ad0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
12ae0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
12af0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
12b00 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
12b10 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
12b20 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
12b30 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
12b40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
12b50 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
12b60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12b70 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
12b80 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
12b90 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
12ba0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
12bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
12bc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12bd0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
12be0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
12bf0 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
12c00 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
12c10 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
12c20 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
12c30 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
12c40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
12c50 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
12c60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
12c70 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
12c80 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
12c90 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
12ca0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
12cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
12cc0 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
12cd0 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
12ce0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
12cf0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
12d00 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
12d10 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
12d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d30 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
12d40 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
12d50 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12d60 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
12d70 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
12d80 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
12d90 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
12da0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
12db0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
12dc0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
12dd0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
12de0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
12df0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
12e00 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
12e10 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
12e20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
12e30 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
12e40 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
12e50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12e60 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12e70 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
12e80 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
12e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12ea0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
12eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12ec0 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
12ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ee0 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
12ef0 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
12f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12f10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
12f20 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
12f30 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
12f40 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
12f50 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
12f60 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
12f70 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
12f80 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
12f90 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
12fa0 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
12fb0 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
12fc0 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
12fd0 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
12fe0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
12ff0 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
13000 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
13010 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
13020 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
13030 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
13040 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
13050 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
13060 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
13070 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
13080 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
13090 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
130a0 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
130b0 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
130c0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
130d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
130e0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
130f0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
13100 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
13110 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
13120 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
13130 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
13140 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
13150 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
13160 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
13170 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
13180 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
13190 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
131a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
131b0 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
131c0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
131d0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
131e0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
131f0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13200 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
13210 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
13220 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
13230 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
13240 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
13250 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
13260 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
13270 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
13280 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
13290 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
132a0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
132b0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
132e0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
132f0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
13300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
13310 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
13320 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
13330 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
13340 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
13350 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
13360 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
13370 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
13380 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
13390 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
133a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
133b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
133c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
133d0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
133e0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
133f0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
13400 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13410 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
13420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
13430 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
13440 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
13450 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
13460 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
13470 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
13480 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
13490 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
134a0 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134c0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
134d0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
134e0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
134f0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
13500 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13510 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
13520 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
13530 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
13540 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13550 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13560 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
13570 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13590 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
135a0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
135b0 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
135c0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
135d0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
135e0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
135f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
13600 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
13610 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13620 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13630 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
13640 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
13650 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
13660 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13670 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13680 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
13690 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
136a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
136b0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
136c0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
136d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
136e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
136f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
13700 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
13710 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
13720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13730 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
13740 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
13750 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13770 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
13780 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
13790 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
137a0 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
137b0 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
137c0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
137d0 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
137e0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
137f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13800 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
13810 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
13820 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
13830 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
13840 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
13850 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
13860 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
13870 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
13880 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
13890 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
138a0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
138b0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
138c0 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
138d0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
138e0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
138f0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
13900 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
13910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
13920 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
13930 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
13940 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
13950 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
13960 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
13970 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
13980 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f  umn );..  saved_
13990 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
139a0 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
139b0 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e  _nSkip = pNew->n
139c0 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c  Skip;.  saved_nL
139d0 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54  Term = pNew->nLT
139e0 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46  erm;.  saved_wsF
139f0 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46  lags = pNew->wsF
13a00 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72  lags;.  saved_pr
13a10 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65  ereq = pNew->pre
13a20 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75  req;.  saved_nOu
13a30 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  t = pNew->nOut;.
13a40 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
13a50 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
13a60 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
13a70 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61 76  rc->iCursor, sav
13a80 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20 20  ed_nEq,.        
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
13ab0 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
13ac0 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70  = 0;.  rSize = p
13ad0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
13ae0 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a  st[0];.  rLogSiz
13af0 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
13b00 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  );.  for(; rc==S
13b10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
13b20 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68  m!=0; pTerm = wh
13b30 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
13b40 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70  n)){.    u16 eOp
13b50 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
13b60 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68  tor;   /* Shorth
13b70 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65  and for pTerm->e
13b80 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Operator */.    
13b90 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b  LogEst rCostIdx;
13ba0 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  .    LogEst nOut
13bb0 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20  Unadjusted;     
13bc0 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72     /* nOut befor
13bd0 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45  e IN() and WHERE
13be0 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a   adjustments */.
13bf0 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b      int nIn = 0;
13c00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13c10 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
13c20 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65  TAT4.    int nRe
13c30 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
13c40 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65  r->nRecValid;.#e
13c50 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f  ndif.    if( (eO
13c60 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p==WO_ISNULL || 
13c70 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26  (pTerm->wtFlags&
13c80 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a  TERM_VNULL)!=0).
13c90 20 20 20 20 20 26 26 20 69 6e 64 65 78 43 6f 6c       && indexCol
13ca0 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62  umnNotNull(pProb
13cb0 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a 20 20  e, saved_nEq).  
13cc0 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
13cd0 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
13ce0 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
13cf0 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
13d00 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
13d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
13d20 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
13d30 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
13d40 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
13d50 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
13d60 6f 77 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  ow the upper bou
13d70 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74  nd of a LIKE opt
13d80 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20  imization range 
13d90 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a  constraint.    *
13da0 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20  * to mix with a 
13db0 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e  lower range boun
13dc0 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65  d from some othe
13dd0 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20  r source */.    
13de0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
13df0 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
13e00 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  T && pTerm->eOpe
13e10 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63  rator==WO_LT ) c
13e20 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
13e30 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 49 53   Do not allow IS
13e40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f   constraints fro
13e50 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  m the WHERE clau
13e60 73 65 20 74 6f 20 62 65 20 75 73 65 64 20 62 79  se to be used by
13e70 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 69 67 68   the.    ** righ
13e80 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
13e90 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f  T JOIN.  Only co
13ea0 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
13eb0 20 4f 4e 20 63 6c 61 75 73 65 20 61 72 65 0a 20   ON clause are. 
13ec0 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f     ** allowed */
13ed0 0a 20 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e  .    if( (pSrc->
13ee0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
13ef0 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26  _LEFT)!=0.     &
13f00 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
13f10 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
13f20 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
13f30 20 20 20 26 26 20 28 65 4f 70 20 26 20 28 57 4f     && (eOp & (WO
13f40 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21  _IS|WO_ISNULL))!
13f50 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
13f60 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
13f70 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  WO_IS );.      t
13f80 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
13f90 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
13fa0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
13fb0 7d 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  }..    pNew->wsF
13fc0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
13fd0 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
13fe0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
13ff0 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
14000 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
14010 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
14020 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
14030 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
14040 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
14050 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
14060 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
14070 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
14080 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
14090 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
140a0 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
140b0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
140c0 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
140d0 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
140e0 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
140f0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
14100 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14110 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
14120 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
14130 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14140 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
14150 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
14160 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14170 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
14180 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
14190 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
141a0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
141b0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
141c0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
141d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
141e0 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28  MN_IN;.      if(
141f0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
14200 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
14210 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
14220 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
14230 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47  T ...)":  TUNING
14240 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  : the SELECT ret
14250 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
14260 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36          nIn = 46
14270 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
14280 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
14290 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
142a0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
142b0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
142c0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
142d0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
142e0 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
142f0 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
14300 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71          nIn = sq
14310 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70  lite3LogEst(pExp
14320 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
14330 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14340 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20    assert( nIn>0 
14350 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79  );  /* RHS alway
14360 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20  s has 2 or more 
14370 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61  terms...  The pa
14380 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  rser.           
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
143a0 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f  changes "x IN (?
143b0 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a  )" into "x=?". *
143c0 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  /..    }else if(
143d0 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f   eOp & (WO_EQ|WO
143e0 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  _IS) ){.      in
143f0 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d  t iCol = pProbe-
14400 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
14410 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  nEq];.      pNew
14420 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14430 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
14440 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65      assert( save
14450 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62  d_nEq==pNew->u.b
14460 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20  tree.nEq );.    
14470 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
14480 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  OWID .       || 
14490 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75  (iCol>0 && nInMu
144a0 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45  l==0 && saved_nE
144b0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
144c0 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  ol-1).      ){. 
144d0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
144e0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e  =0 && pProbe->un
144f0 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  iqNotNull==0 ){.
14500 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
14510 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14520 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
14530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14540 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14550 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
14560 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
14570 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14580 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
14590 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
145a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
145b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
145c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
145d0 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
145e0 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
145f0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14600 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
14610 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
14620 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
14630 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14640 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
14650 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
14660 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
14670 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
14680 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
14690 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
146a0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
146b0 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
146c0 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
146d0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
146e0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
146f0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
14700 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
14710 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
14720 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
14730 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14740 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
14750 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
14760 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
14770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
14780 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
14790 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
147a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
147b0 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
147c0 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
147d0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
147e0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
147f0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
14800 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
14810 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
14820 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
14830 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
14840 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14850 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
14860 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a  _LIMIT;.      }.
14870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14880 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
14890 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
148a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
148b0 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
148c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
148d0 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
148e0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
148f0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14900 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
14910 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
14920 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
14930 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
14940 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14950 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
14960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14970 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
14980 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
14990 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
149a0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
149b0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
149c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
149d0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
149e0 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
149f0 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
14a00 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
14a10 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
14a20 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
14a30 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
14a40 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
14a50 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
14a60 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
14a70 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
14a80 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
14a90 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
14aa0 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
14ab0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
14ac0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
14ad0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
14ae0 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
14af0 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
14b00 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
14b10 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14b20 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14b30 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
14b40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14b50 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
14b60 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
14b70 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
14b80 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
14b90 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
14ba0 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
14bb0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
14bc0 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
14bd0 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
14be0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
14bf0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14c00 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
14c10 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
14c20 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
14c30 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
14c40 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
14c50 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
14c60 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
14c70 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
14c80 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
14c90 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
14ca0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
14cb0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
14cc0 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
14cd0 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
14ce0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
14cf0 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
14d00 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
14d10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
14d20 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
14d30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
14d40 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
14d50 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
14d60 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
14d70 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
14d80 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
14d90 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14da0 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
14db0 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
14dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
14dd0 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
14de0 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
14df0 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
14e00 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14e10 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
14e20 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
14e30 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
14e40 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
14e50 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
14e60 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
14e70 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
14e80 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
14e90 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
14ea0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
14eb0 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
14ec0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
14ed0 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
14ee0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14ef0 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
14f00 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14f10 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
14f20 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
14f30 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14f40 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
14f50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
14f60 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
14f70 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14f80 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
14f90 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
14fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14fb0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14fc0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
14fd0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14fe0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
14ff0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
15000 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
15010 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
15020 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
15030 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
15040 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15050 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
15060 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
15070 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
15080 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
15090 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
150a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
150b0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
150c0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
150d0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
150e0 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
150f0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
15100 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
15110 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
15120 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
15130 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15140 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
15150 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
15160 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
15170 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
15180 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
15190 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
151a0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
151b0 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
151c0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
151d0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
151e0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
151f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
15200 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
15210 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
15220 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
15230 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
15240 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
15250 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
15260 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
15270 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
15280 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
15290 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
152a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
152b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
152c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
152d0 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
152e0 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
152f0 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
15300 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
15310 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
15320 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
15330 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
15340 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
15350 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
15360 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
15370 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
15380 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
15390 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
153a0 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
153b0 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
153c0 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
153d0 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
153e0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
153f0 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
15400 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
15410 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
15420 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
15430 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
15440 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
15450 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
15460 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
15470 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
15480 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
15490 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
154a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
154b0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
154c0 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
154d0 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
154e0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
154f0 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
15500 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
15510 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
15520 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
15530 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
15540 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
15550 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
15560 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
15570 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
15580 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
15590 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
155a0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
155b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
155c0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
155d0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
155e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
155f0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
15600 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
15610 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15620 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
15630 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15640 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
15650 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
15660 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15670 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
15680 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
15690 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
156a0 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
156b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
156c0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
156d0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
156e0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
156f0 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
15700 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15710 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
15720 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15730 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15740 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
15750 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
15760 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
15770 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
15780 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
15790 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
157a0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
157b0 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
157c0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
157d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
157e0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
157f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15800 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
15810 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
15820 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
15830 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
15840 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
15850 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
15860 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
15870 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
15880 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
15890 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
158a0 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
158b0 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
158c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
158d0 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
158e0 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
158f0 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
15900 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
15910 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
15920 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
15930 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
15940 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
15950 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
15960 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
15970 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
15980 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
15990 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
159a0 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
159b0 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
159c0 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
159d0 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
159e0 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
159f0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
15a00 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
15a10 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
15a20 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
15a30 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
15a40 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
15a50 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
15a60 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
15a70 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
15a80 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
15a90 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
15aa0 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
15ab0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
15ac0 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
15ad0 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
15ae0 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
15af0 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
15b00 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
15b10 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15b20 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
15b30 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
15b40 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
15b50 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
15b60 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
15b70 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
15b80 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
15b90 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
15ba0 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
15bb0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
15bc0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
15bd0 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
15be0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
15bf0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
15c00 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
15c10 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
15c20 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
15c30 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
15c40 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
15c50 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
15c60 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
15c70 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
15c80 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
15c90 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
15ca0 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
15cb0 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
15cc0 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
15cd0 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
15ce0 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
15cf0 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
15d00 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
15d10 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
15d20 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
15d30 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
15d40 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15d50 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
15d60 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
15d70 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
15d80 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
15d90 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
15da0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
15db0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
15dc0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
15dd0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
15de0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
15df0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
15e00 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
15e10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
15e20 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
15e30 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
15e40 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
15e50 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
15e60 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
15e70 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
15e80 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
15e90 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
15ea0 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
15eb0 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
15ec0 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
15ed0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
15ee0 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
15ef0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
15f00 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
15f10 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
15f20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15f30 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
15f40 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
15f50 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
15f60 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
15f70 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
15f80 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
15f90 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45  prList *pOB;.  E
15fa0 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70  xprList *aColExp
15fb0 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  r;.  int ii, jj;
15fc0 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
15fd0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
15fe0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
15ff0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
16000 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
16010 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
16020 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
16030 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
16040 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
16050 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
16060 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
16070 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
16080 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
16090 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
160a0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
160b0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sor ){.      if(
160c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
160d0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
160e0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
160f0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
16100 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
16110 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
16120 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43  umn==pIndex->aiC
16130 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75  olumn[jj] ) retu
16140 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
16150 20 20 7d 65 6c 73 65 20 69 66 28 20 28 61 43 6f    }else if( (aCo
16160 6c 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  lExpr = pIndex->
16170 61 43 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a  aColExpr)!=0 ){.
16180 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
16190 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
161a0 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
161b0 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
161c0 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f  iColumn[jj]!=XN_
161d0 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
161e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
161f0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
16200 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e  pExpr,aColExpr->
16210 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  a[jj].pExpr,iCur
16220 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sor)==0 ){.     
16230 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
16240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16250 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16260 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16270 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
16280 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
16290 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
162a0 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
162b0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
162c0 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
162d0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
162e0 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
162f0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
16300 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
16310 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
16320 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
16330 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
16340 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
16350 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
16360 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
16370 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
16380 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
16390 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
163a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
163b0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
163c0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
163d0 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
163e0 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
163f0 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
16400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
16410 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
16420 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
16430 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
16440 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
16450 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
16460 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
16470 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
16480 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
16490 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
164a0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
164b0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
164c0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
164d0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
164e0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
164f0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
16500 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69  rm *pTerm;.  whi
16510 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
16520 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66  TK_AND ){.    if
16530 28 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  ( !whereUsablePa
16540 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c  rtialIndex(iTab,
16550 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66  pWC,pWhere->pLef
16560 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
16570 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65     pWhere = pWhe
16580 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a  re->pRight;.  }.
16590 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
165a0 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
165b0 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
165c0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
165d0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
165e0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
165f0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
16600 45 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65  Expr(pExpr, pWhe
16610 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20  re, iTab) .     
16620 26 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70  && (!ExprHasProp
16630 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
16640 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70  romJoin) || pExp
16650 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
16660 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b  le==iTab).    ){
16670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
16680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16690 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
166a0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
166b0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
166c0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
166d0 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74  the join where t
166e0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69  he table.** is i
166f0 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c  denfied by pBuil
16700 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
16710 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
16720 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
16730 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
16740 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
16750 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
16760 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c  he costs (WhereL
16770 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65  oop.rRun) of the
16780 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64   b-tree loops ad
16790 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ded by this func
167a0 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63  tion.** are calc
167b0 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
167c0 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66  s:.**.** For a f
167d0 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69  ull scan, assumi
167e0 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72  ng the table (or
167f0 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73   index) contains
16800 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a   nRow rows:.**.*
16810 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
16820 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20  w * 3.0         
16830 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75             // fu
16840 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll-table scan.**
16850 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
16860 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20   * K            
16870 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
16880 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e  n of covering in
16890 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
168a0 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29  = nRow * (K+3.0)
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63  // scan of non-c
168d0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
168e0 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61  .** where K is a
168f0 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
16900 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62  .1 and 3.0 set b
16910 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61  ased on the rela
16920 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74  tive .** estimat
16930 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  ed average size 
16940 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
16950 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a   table records..
16960 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64  **.** For an ind
16970 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e  ex scan, where n
16980 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d  Visit is the num
16990 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77  ber of index row
169a0 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  s visited.** by 
169b0 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53  the scan, and nS
169c0 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65  eek is the numbe
169d0 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74  r of seek operat
169e0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e  ions required on
169f0 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62   .** the index b
16a00 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  -tree:.**.**    
16a10 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
16a20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a  (log(nRow) + K *
16a30 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20   nVisit)        
16a40 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e    // covering in
16a50 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
16a60 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
16a70 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a  Row) + (K+3.0) *
16a80 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e   nVisit)    // n
16a90 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
16aa0 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  x.**.** Normally
16ab0 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53  , nSeek is 1. nS
16ac0 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74  eek values great
16ad0 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61  er than 1 come a
16ae0 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20  bout if the .** 
16af0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63  WHERE clause inc
16b00 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e  ludes "x IN (...
16b10 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69  .)" terms used i
16b20 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22  n place of "x=?"
16b30 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d  . Or when .** im
16b40 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45  plicit "x IN (SE
16b50 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29  LECT x FROM tbl)
16b60 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  " terms are adde
16b70 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73  d for skip-scans
16b80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
16b90 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52  mated values (nR
16ba0 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65  ow, nVisit, nSee
16bb0 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e  k) often contain
16bc0 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a   a large amount.
16bd0 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74  ** of uncertaint
16be0 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  y.  For this rea
16bf0 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20  son, scoring is 
16c00 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b  designed to pick
16c10 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22   plans that.** "
16c20 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72  do the least har
16c30 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61  m" if the estima
16c40 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61  tes are inaccura
16c50 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  te.  For example
16c60 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29  , a.** log(nRow)
16c70 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74   factor is omitt
16c80 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f  ed from a non-co
16c90 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
16ca0 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a  n in order to.**
16cb0 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e   bias the scorin
16cc0 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73  g in favor of us
16cd0 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69  ing an index, si
16ce0 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61  nce the worst-ca
16cf0 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  se.** performanc
16d00 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  e of using an in
16d10 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65  dex is far bette
16d20 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74  r than the worst
16d30 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63  -case performanc
16d40 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74  e.** of a full t
16d50 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74  able scan..*/.st
16d60 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
16d70 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
16d80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
16d90 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
16da0 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
16db0 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
16dc0 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
16dd0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
16de0 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
16df0 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
16e00 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
16e10 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
16e20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
16e30 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
16e40 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
16e50 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
16e60 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
16e70 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
16e80 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
16eb0 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
16ec0 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
16ed0 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74   LogEst aiRowEst
16ee0 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20  Pk[2];       /* 
16ef0 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b  The aiRowLogEst[
16f00 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
16f10 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
16f20 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  16 aiColumnPk = 
16f30 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
16f40 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
16f50 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
16f60 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
16f70 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
16f80 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
16f90 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
16fa0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
16fb0 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
16fc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
16fd0 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
16fe0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
16ff0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
17000 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
17010 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
17020 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17030 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
17040 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
17050 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
17060 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
17070 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
17080 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170a0 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
170b0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
170c0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
170d0 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
170e0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
170f0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
17100 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
17110 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
17120 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
17130 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
17140 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
17150 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
17160 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64     /* The parsed
17170 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
17180 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171a0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
171b0 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e  eried */.  .  pN
171c0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
171d0 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
171e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
171f0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
17200 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
17210 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
17220 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
17230 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  ab;.  pTab = pSr
17240 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d  c->pTab;.  pWC =
17250 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
17260 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
17270 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
17280 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
17290 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20  >pIBIndex ){.   
172a0 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
172b0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
172c0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
172d0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
172e0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
172f0 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d  c->pIBIndex;.  }
17300 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77  else if( !HasRow
17310 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
17320 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70  pProbe = pTab->p
17330 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
17340 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
17350 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
17360 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
17370 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
17380 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
17390 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
173a0 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
173b0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
173c0 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
173d0 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
173e0 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
173f0 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
17400 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
17410 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
17420 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
17430 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
17440 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
17470 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
17480 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
17490 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
174a0 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
174b0 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20    sPk.nKeyCol = 
174c0 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  1;.    sPk.nColu
174d0 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
174e0 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
174f0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
17500 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69  aiRowLogEst = ai
17510 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
17520 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
17530 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
17540 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
17550 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20     sPk.szIdxRow 
17560 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  = pTab->szTabRow
17570 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
17580 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
17590 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  LogEst;.    aiRo
175a0 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20  wEstPk[1] = 0;. 
175b0 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
175c0 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
175d0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67      if( pSrc->fg
175e0 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
175f0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
17600 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
17610 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
17620 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
17630 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
17640 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
17650 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
17660 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
17670 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
17680 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
17690 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
176a0 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
176b0 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  Size = pTab->nRo
176c0 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53  wLogEst;.  rLogS
176d0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
176e0 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ze);..#ifndef SQ
176f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
17700 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41  TIC_INDEX.  /* A
17710 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
17720 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
17730 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20  der->pOrSet     
17740 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20   /* Not part of 
17750 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  an OR optimizati
17760 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49  on */.   && (pWI
17770 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17780 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49  & WHERE_NO_AUTOI
17790 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28  NDEX)==0.   && (
177a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
177b0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
177c0 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
177d0 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42  .   && pSrc->pIB
177e0 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a  Index==0      /*
177f0 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20   Has no INDEXED 
17800 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
17810 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74  && !pSrc->fg.not
17820 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73  Indexed   /* Has
17830 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   no NOT INDEXED 
17840 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
17850 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 20  HasRowid(pTab)  
17860 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49         /* Not WI
17870 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
17880 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e  e. (FIXME: Why n
17890 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70  ot?) */.   && !p
178a0 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  Src->fg.isCorrel
178b0 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f  ated /* Not a co
178c0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
178d0 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  y */.   && !pSrc
178e0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
178f0 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72    /* Not a recur
17900 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  sive common tabl
17910 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  e expression. */
17920 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
17930 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
17940 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
17950 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
17960 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
17970 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
17980 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
17990 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
179a0 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
179b0 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
179c0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
179d0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
179e0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
179f0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
17a00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17a10 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
17a20 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
17a30 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
17a40 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
17a50 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
17a60 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
17a70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17a80 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
17a90 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
17aa0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
17ab0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
17ac0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
17ad0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
17ae0 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
17af0 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
17b00 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
17b10 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
17b20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
17b30 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  X*N*log2(N) wher
17b40 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
17b50 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
17b60 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
17b70 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
17b80 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37  and where X is 7
17b90 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72   (LogEst=28) for
17ba0 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20   normal.        
17bb0 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33  ** tables or 1.3
17bc0 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f  75 (LogEst=4) fo
17bd0 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
17be0 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c  ueries.  The val
17bf0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ue.        ** of
17c00 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f   X is smaller fo
17c10 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
17c20 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74  ueries so that t
17c30 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
17c40 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
17c50 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73   be more aggress
17c60 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61  ive about genera
17c70 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69  ting automatic i
17c80 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20  ndexes for.     
17c90 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65     ** those obje
17ca0 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65  cts, since there
17cb0 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69   is no opportuni
17cc0 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61  ty to add schema
17cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
17ce0 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65  xes on subquerie
17cf0 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a  s and views. */.
17d00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
17d10 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
17d20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20  + rSize + 4;.   
17d30 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
17d40 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
17d50 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
17d60 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
17d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
17d80 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b  w->rSetup += 24;
17d90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17da0 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
17db0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65  iplier(pNew->rSe
17dc0 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  tup, pTab->costM
17dd0 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ult);.        /*
17de0 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e   TUNING: Each in
17df0 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64  dex lookup yield
17e00 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65  s 20 rows in the
17e10 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20   table.  This.  
17e20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65        ** is more
17e30 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20   than the usual 
17e40 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73  guess of 10 rows
17e50 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  , since we have 
17e60 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a  no way.        *
17e70 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77  * of knowing how
17e80 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69   selective the i
17e90 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61  ndex will ultima
17ea0 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75  tely be.  It wou
17eb0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ld.        ** no
17ec0 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c  t be unreasonabl
17ed0 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76  e to make this v
17ee0 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72  alue much larger
17ef0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
17f00 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61  w->nOut = 43;  a
17f10 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74  ssert( 43==sqlit
17f20 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a  e3LogEst(20) );.
17f30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
17f40 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
17f50 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70  stAdd(rLogSize,p
17f60 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
17f70 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17f80 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s = WHERE_AUTO_I
17f90 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
17fa0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
17fb0 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
17fc0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
17fd0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
17fe0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
17ff0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
18000 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18010 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18020 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
18030 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
18040 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20  er all indices. 
18050 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
18060 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
18070 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
18080 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74  be->pNext, iSort
18090 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
180a0 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
180b0 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
180c0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
180d0 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e  tialIndex(pSrc->
180e0 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50  iCursor, pWC, pP
180f0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
18100 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65  ere) ){.      te
18110 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54  stcase( pNew->iT
18120 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  ab!=pSrc->iCurso
18130 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63  r );  /* See tic
18140 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d  ket [98d973b8f5]
18150 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
18160 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
18170 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
18180 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
18190 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
181a0 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
181b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
181c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
181d0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
181e0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
181f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
18200 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18210 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
18220 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
18230 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72   0;.    pNew->pr
18240 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
18250 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
18260 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d  rSize;.    pNew-
18270 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
18280 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20  = pProbe;.    b 
18290 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  = indexMightHelp
182a0 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69  WithOrderBy(pBui
182b0 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53  lder, pProbe, pS
182c0 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
182d0 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53    /* The ONEPASS
182e0 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e  _DESIRED flags n
182f0 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65  ever occurs toge
18300 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20  ther with ORDER 
18310 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  BY */.    assert
18320 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
18330 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
18340 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
18350 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20  0 || b==0 );.   
18360 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75   if( pProbe->tnu
18370 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  m<=0 ){.      /*
18380 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   Integer primary
18390 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20   key index */.  
183a0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
183b0 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a  s = WHERE_IPK;..
183c0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61        /* Full ta
183d0 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ble scan */.    
183e0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
183f0 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
18400 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  : 0;.      /* TU
18410 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75  NING: Cost of fu
18420 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73  ll table scan is
18430 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20   (N*3.0). */.   
18440 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
18450 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20  rSize + 16;.    
18460 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
18470 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
18480 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
18490 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
184a0 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
184b0 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
184c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
184d0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
184e0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
184f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18500 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   rSize;.      if
18510 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
18520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
18530 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20  itmask m;.      
18540 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f  if( pProbe->isCo
18550 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  vering ){.      
18560 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18570 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
18580 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
18590 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b  ;.        m = 0;
185a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
185b0 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e        m = pSrc->
185c0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
185d0 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
185e0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
185f0 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
18600 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
18610 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
18620 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
18630 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
18640 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
18650 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
18660 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
18670 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  || !HasRowid(pTa
18680 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d  b).       || ( m
18690 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
186a0 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
186b0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
186c0 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  & (pProbe->szIdx
186d0 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
186e0 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ow).         && 
186f0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
18700 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
18710 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a  ASS_DESIRED)==0.
18720 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
18730 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18740 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20  bUseCis.        
18750 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
18760 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e  Enabled(pWInfo->
18770 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
18780 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29  TE_CoverIdxScan)
18790 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20  .          ).   
187a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e     ){.        pN
187b0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
187c0 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
187d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
187e0 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
187f0 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73  g the index rows
18800 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b   is N*K, where K
18810 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62   is.        ** b
18820 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
18830 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .0, depending on
18840 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
18850 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20  zes of the.     
18860 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20     ** index and 
18870 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74  table rows. If t
18880 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
18890 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
188a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73  ,.        ** als
188b0 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f  o add the cost o
188c0 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65  f visiting table
188d0 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20   rows (N*3.0).  
188e0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
188f0 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
18900 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
18910 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e  szIdxRow)/pTab->
18920 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20  szTabRow;.      
18930 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20    if( m!=0 ){.  
18940 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
18950 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
18960 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
18970 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20  , rSize+16);.   
18980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
18990 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
189a0 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
189b0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
189c0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
189d0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
189e0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
189f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
18a00 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
18a10 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
18a20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
18a30 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
18a40 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
18a50 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18a60 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
18a70 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
18a80 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
18a90 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69  , pProbe, 0);.#i
18aa0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18ab0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
18ac0 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
18ad0 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
18ae0 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
18af0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
18b00 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
18b10 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
18b20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
18b30 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
18b40 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18b50 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
18b60 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
18b70 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
18b80 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
18b90 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20 62  rc->pIBIndex ) b
18ba0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
18bb0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
18bc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18bd0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
18be0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
18bf0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
18c00 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
18c10 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
18c20 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
18c30 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
18c40 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
18c50 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
18c60 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
18c70 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
18c80 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
18c90 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65  OIN joins in the
18ca0 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 45 78   query, both mEx
18cb0 74 72 61 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  tra and.** mUnus
18cc0 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
18cd0 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 45  0. Otherwise, mE
18ce0 78 74 72 61 20 69 73 20 61 20 6d 61 73 6b 20 6f  xtra is a mask o
18cf0 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  f all FROM claus
18d00 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  e.** entries tha
18d10 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
18d20 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
18d30 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
18d40 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73  use and are.** s
18d50 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
18d60 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
18d70 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
18d80 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  OIN. Similarly, 
18d90 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  the.** mUnusable
18da0 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61   mask contains a
18db0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ll FROM clause e
18dc0 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
18dd0 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76  r after the.** v
18de0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64  irtual table and
18df0 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66   are separated f
18e00 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61  rom it by at lea
18e10 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a  st one LEFT or .
18e20 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a  ** CROSS JOIN. .
18e30 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
18e40 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  e, if the query 
18e50 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  were:.**.**   ..
18e60 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45  . FROM t1, t2 LE
18e70 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20  FT JOIN t3, t4, 
18e80 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35  vt CROSS JOIN t5
18e90 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , t6;.**.** then
18ea0 20 6d 45 78 74 72 61 20 63 6f 72 72 65 73 70 6f   mExtra correspo
18eb0 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20  nds to (t1, t2) 
18ec0 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f  and mUnusable to
18ed0 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a   (t5, t6)..**.**
18ee0 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20   All the tables 
18ef0 69 6e 20 6d 45 78 74 72 61 20 6d 75 73 74 20 62  in mExtra must b
18f00 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
18f10 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
18f20 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20  tual .** table. 
18f30 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  So any terms for
18f40 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65   which all prere
18f50 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74  quisites are sat
18f60 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 45  isfied by .** mE
18f70 78 74 72 61 20 6d 61 79 20 62 65 20 73 70 65 63  xtra may be spec
18f80 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c 65  ified as "usable
18f90 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74  " in all calls t
18fa0 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a  o xBestIndex. .*
18fb0 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c  * Conversely, al
18fc0 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75  l tables in mUnu
18fd0 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73 63  sable must be sc
18fe0 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  anned after the 
18ff0 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75  current.** virtu
19000 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79  al table, so any
19010 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
19020 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69 74   the prerequisit
19030 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68 0a  es overlap with.
19040 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f  ** mUnusable sho
19050 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6f  uld always be co
19060 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f 74  nfigured as "not
19070 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42 65  -usable" for xBe
19080 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  stIndex..*/.stat
19090 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
190a0 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68  AddVirtual(.  Wh
190b0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
190c0 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48  pBuilder,  /* WH
190d0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
190e0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
190f0 61 73 6b 20 6d 45 78 74 72 61 2c 20 20 20 20 20  ask mExtra,     
19100 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
19110 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
19120 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
19130 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74  his one */.  Bit
19140 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20  mask mUnusable  
19150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19160 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
19170 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
19180 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20  his one */.){.  
19190 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
191a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
191b0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
191c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
191d0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
191e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
191f0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
19200 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
19210 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
19220 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
19230 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
19240 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19250 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
19260 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
19270 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
19280 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
19290 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
192a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
192b0 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
192c0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
192d0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
192e0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
192f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
19300 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
19310 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
19320 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
19330 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
19340 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
19350 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
19360 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
19370 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19380 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
19390 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
193a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
193b0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
193c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
193d0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
193e0 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
193f0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
19400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19410 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
19420 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
19430 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
19440 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
19450 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
19460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
19470 20 61 73 73 65 72 74 28 20 28 6d 45 78 74 72 61   assert( (mExtra
19480 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30   & mUnusable)==0
19490 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70   );.  pWInfo = p
194a0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
194b0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
194c0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
194d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
194e0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
194f0 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
19500 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
19510 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
19520 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
19530 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62  w->iTab];.  pTab
19540 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
19550 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
19560 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49  al(pTab) );.  pI
19570 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74  dxInfo = allocat
19580 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
19590 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c  e, pWC, mUnusabl
195a0 65 2c 20 70 53 72 63 2c 70 42 75 69 6c 64 65 72  e, pSrc,pBuilder
195b0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  ->pOrderBy);.  i
195c0 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
195d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
195e0 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72  OMEM;.  pNew->pr
195f0 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ereq = 0;.  pNew
19600 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
19610 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
19620 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
19630 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  LE;.  pNew->nLTe
19640 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  rm = 0;.  pNew->
19650 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
19660 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  = 0;.  pUsage = 
19670 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
19680 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43  raintUsage;.  nC
19690 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
196a0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
196b0 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f  t;.  if( whereLo
196c0 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
196d0 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
196e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
196f0 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
19700 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
19710 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
19720 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30  ..  for(iPhase=0
19730 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68  ; iPhase<=3; iPh
19740 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ase++){.    if( 
19750 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61  !seenIn && (iPha
19760 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  se&1)!=0 ){.    
19770 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20    iPhase++;.    
19780 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29    if( iPhase>3 )
19790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
197a0 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26    if( !seenVar &
197b0 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65  & iPhase>1 ) bre
197c0 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ak;.    pIdxCons
197d0 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
197e0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
197f0 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
19800 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
19810 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
19820 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
19830 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
19840 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d  ns++){.      j =
19850 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19860 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54  Offset;.      pT
19870 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
19880 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
19890 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20  iPhase ){.      
198a0 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20    case 0:    /* 
198b0 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75  Constants withou
198c0 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  t IN operator */
198d0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
198e0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b  ons->usable = 0;
198f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
19900 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19910 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
19920 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
19930 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  In = 1;.        
19940 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
19950 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
19960 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61 29  Right & ~mExtra)
19970 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
19980 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
19990 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
199a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
199b0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
199c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
199d0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
199e0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
199f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
19a00 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
19a10 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
19a20 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
19a30 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
19a40 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
19a50 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
19a60 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
19a70 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
19a80 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61 29  Right & ~mExtra)
19a90 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
19aa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
19ab0 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69  se 2:    /* Vari
19ac0 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
19ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
19ae0 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b  sert( seenVar );
19af0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
19b00 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
19b10 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
19b20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20  & WO_IN)==0;.   
19b30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19b40 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
19b50 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
19b60 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  th IN */.       
19b70 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
19b80 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a  ar && seenIn );.
19b90 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
19ba0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
19bb0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19bd0 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65     memset(pUsage
19be0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
19bf0 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
19c00 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
19c10 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
19c20 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
19c30 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
19c40 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
19c50 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  r);.    pIdxInfo
19c60 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
19c70 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
19c80 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
19c90 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
19ca0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
19cb0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
19cc0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
19cd0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
19ce0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
19cf0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
19d00 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49 64  ouble)2;.    pId
19d10 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
19d20 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20 70  Rows = 25;.    p
19d30 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
19d40 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
19d50 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
19d60 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
19d70 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
19d80 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
19d90 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
19da0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
19db0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19dc0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19dd0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19de0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
19df0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
19e00 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
19e10 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
19e20 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
19e30 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
19e40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19e50 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
19e60 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
19e70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19e80 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19e90 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19ea0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19eb0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19ec0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
19ed0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
19ee0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
19ef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19f00 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19f10 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
19f20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
19f30 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
19f40 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
19f50 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
19f60 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
19f70 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
19f80 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
19f90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19fa0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19fc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
19fd0 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
19fe0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
19ff0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1a000 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
1a010 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
1a020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a030 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1a040 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
1a050 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1a060 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
1a070 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a080 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
1a090 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
1a0a0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
1a0b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1a0c0 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
1a0d0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1a0e0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
1a0f0 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
1a100 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a110 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1a120 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
1a130 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
1a140 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
1a150 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a160 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1a170 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a180 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
1a190 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
1a1a0 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1a1b0 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1a1c0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1a1d0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1a1e0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1a1f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1a200 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
1a210 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
1a220 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
1a230 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a240 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
1a250 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
1a260 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
1a270 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1a280 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
1a290 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
1a2a0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
1a2b0 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
1a2c0 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
1a2d0 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
1a2e0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
1a2f0 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
1a300 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
1a310 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
1a320 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
1a330 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
1a340 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a360 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1a370 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1a380 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1a390 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1a3a0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
1a3b0 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
1a3c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1a3d0 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
1a3e0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
1a3f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
1a400 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1a410 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1a420 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1a430 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1a440 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
1a450 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
1a460 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
1a470 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
1a480 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1a490 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1a4a0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a4b0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1a4c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a4d0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1a4e0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1a4f0 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1a500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a510 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a520 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
1a530 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
1a540 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
1a550 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a560 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
1a570 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1a580 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1a590 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
1a5a0 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
1a5b0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a5c0 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1a5d0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1a5e0 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
1a5f0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1a600 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
1a610 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1a620 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
1a630 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
1a640 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
1a650 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49  rdered = (i8)(pI
1a660 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1a670 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20  onsumed ?.      
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
1a6b0 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  By : 0);.      p
1a6c0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1a6d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1a6e0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1a6f0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
1a700 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1a710 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
1a720 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
1a730 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
1a740 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
1a750 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
1a760 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1a770 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65 73  flag if the xBes
1a780 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1a790 69 6e 64 69 63 61 74 65 64 0a 20 20 20 20 20 20  indicated.      
1a7a0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1a7b0 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1a7c0 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1a7d0 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1a7e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
1a7f0 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1a800 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   & SQLITE_INDEX_
1a810 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20  SCAN_UNIQUE ){. 
1a820 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1a830 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
1a840 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EROW;.      }els
1a850 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
1a860 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1a870 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
1a880 20 7d 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f   }.      whereLo
1a890 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a8a0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a8b0 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
1a8c0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
1a8d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a8e0 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
1a8f0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
1a900 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1a910 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
1a920 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
1a930 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
1a940 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
1a950 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a960 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
1a970 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
1a980 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
1a990 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1a9a0 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
1a9b0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1a9c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1a9d0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
1a9e0 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
1a9f0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
1aa00 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
1aa10 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
1aa20 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
1aa30 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1aa40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1aa50 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1aa60 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1aa70 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a  der *pBuilder, .
1aa80 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
1aa90 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  , .  Bitmask mUn
1aaa0 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72  usable.){.  Wher
1aab0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1aac0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1aad0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1aae0 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
1aaf0 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
1ab00 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
1ab10 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
1ab20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1ab30 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
1ab40 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
1ab50 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1ab60 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
1ab70 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
1ab80 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
1ab90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1aba0 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
1abb0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1abc0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1abd0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
1abe0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1abf0 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
1ac00 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
1ac10 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
1ac20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1ac30 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
1ac40 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
1ac50 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
1ac60 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1ac70 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
1ac80 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1ac90 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
1aca0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1acb0 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
1acc0 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1acd0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
1ace0 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
1acf0 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
1ad00 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
1ad10 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
1ad20 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
1ad30 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1ad40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
1ad50 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
1ad60 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
1ad70 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
1ad80 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1ad90 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
1ada0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
1adb0 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
1adc0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
1add0 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
1ade0 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
1adf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
1ae00 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
1ae10 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
1ae20 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1ae30 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
1ae40 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1ae50 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1ae60 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
1ae70 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
1ae80 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
1ae90 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1aea0 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
1aeb0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
1aec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1aed0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1aee0 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
1aef0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1af00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
1af10 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1af20 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
1af30 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
1af40 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
1af50 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1af60 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
1af70 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1af80 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
1af90 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
1afa0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1afb0 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
1afc0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
1afd0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1afe0 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
1aff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b000 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1b020 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
1b030 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1b040 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
1b050 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1b060 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
1b070 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
1b080 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
1b090 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1b0a0 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
1b0b0 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
1b0c0 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
1b0d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1b0e0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1b0f0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
1b100 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b110 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  <sSubBuild.pWC->
1b120 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
1b130 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65           whereTe
1b140 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69  rmPrint(&sSubBui
1b150 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29  ld.pWC->a[i], i)
1b160 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b170 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
1b180 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b190 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1b1a0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
1b1b0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1b1c0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
1b1d0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b1e0 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
1b1f0 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e  ild, mExtra, mUn
1b200 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1b210 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1b220 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b230 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b240 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1b250 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
1b260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b270 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1b290 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1b2a0 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1b2b0 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65  Extra, mUnusable
1b2c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b2d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1b2e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
1b2f0 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
1b300 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
1b310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1b320 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1b330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
1b350 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
1b360 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
1b370 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
1b380 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1b390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b3a0 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
1b3b0 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
1b3c0 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1b3d0 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
1b3e0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1b3f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
1b400 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
1b410 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1b420 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b430 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
1b440 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1b450 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
1b460 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
1b470 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
1b480 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1b4b0 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
1b4c0 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
1b4d0 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1b500 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
1b510 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
1b520 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
1b530 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1b540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b550 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
1b560 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1b570 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
1b580 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
1b590 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1b5a0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
1b5b0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
1b5c0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
1b5d0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
1b5e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1b5f0 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
1b600 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
1b610 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1b620 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
1b630 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
1b640 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1b650 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
1b660 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
1b670 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
1b680 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
1b690 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
1b6a0 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
1b6b0 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
1b6c0 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
1b6d0 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
1b6e0 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
1b6f0 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
1b700 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
1b710 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
1b720 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
1b730 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
1b740 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
1b750 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
1b760 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
1b770 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
1b780 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
1b790 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
1b7a0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
1b7b0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
1b7c0 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
1b7d0 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
1b7e0 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
1b7f0 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
1b800 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
1b810 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
1b820 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
1b830 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1b840 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
1b850 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
1b860 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
1b870 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1b880 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
1b890 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
1b8a0 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
1b8b0 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
1b8c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1b8d0 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
1b8e0 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
1b8f0 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
1b900 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1b910 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
1b920 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
1b930 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
1b940 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
1b950 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1b960 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
1b970 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
1b980 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1b990 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1b9a0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1b9b0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1b9c0 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
1b9d0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1b9e0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1b9f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ba00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1ba10 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1ba20 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
1ba30 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
1ba40 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1ba50 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
1ba60 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1ba70 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
1ba80 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1ba90 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
1baa0 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
1bab0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1bac0 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1bad0 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1bae0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1baf0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1bb00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1bb10 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1bb20 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bb30 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1bb40 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1bb50 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1bb60 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1bb70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1bb80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bb90 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1bba0 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1bbb0 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1bbc0 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1bbd0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1bbe0 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1bbf0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1bc00 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1bc10 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1bc20 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1bc30 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1bc40 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1bc50 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1bc60 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1bc70 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1bc80 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1bc90 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1bca0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1bcb0 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1bcc0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1bcd0 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1bce0 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1bcf0 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1bd00 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1bd10 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1bd20 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1bd30 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1bd40 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1bd50 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1bd60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1bd70 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1bd80 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1bd90 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1bda0 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1bdb0 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50       mExtra = mP
1bdc0 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
1bdd0 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1bde0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
1bdf0 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
1be00 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1be10 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  b) ){.      stru
1be20 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1be30 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
1be40 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e  &pItem[1]; p<pEn
1be50 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
1be60 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c   if( mUnusable |
1be70 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  | (p->fg.jointyp
1be80 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1be90 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20  CROSS)) ){.     
1bea0 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c       mUnusable |
1beb0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1bec0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1bed0 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72  MaskSet, p->iCur
1bee0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sor);.        }.
1bef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1bf00 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1bf10 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
1bf20 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62   mExtra, mUnusab
1bf30 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
1bf40 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1bf50 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
1bf60 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
1bf70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1bf80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bf90 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1bfa0 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
1bfb0 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73  r, mExtra, mUnus
1bfc0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1bfd0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1bfe0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1bff0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1c000 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1c010 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1c020 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1c030 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1c040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1c050 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1c060 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1c070 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1c080 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
1c090 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1c0a0 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1c0b0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1c0c0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1c0d0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1c0e0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1c0f0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1c100 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1c110 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1c120 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1c130 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1c140 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1c150 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1c160 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1c170 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c180 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1c190 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1c1a0 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1c1b0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1c1c0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1c1d0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1c1e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1c1f0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1c200 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1c210 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c220 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1c230 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1c240 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c250 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1c260 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1c270 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1c280 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1c290 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1c2a0 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1c2b0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1c2c0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1c2d0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1c2e0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1c2f0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1c300 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1c310 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1c320 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1c330 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1c340 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c350 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1c360 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1c370 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1c380 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1c390 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1c3a0 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1c3b0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1c3c0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1c3d0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1c3e0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1c3f0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1c400 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1c410 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1c420 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c430 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c440 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1c450 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1c460 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1c470 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1c480 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1c490 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1c4a0 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1c4b0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1c4c0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1c4d0 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
1c4e0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
1c4f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c500 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
1c510 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1c520 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1c530 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
1c540 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
1c550 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
1c560 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
1c570 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
1c580 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
1c590 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
1c5a0 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
1c5b0 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
1c5c0 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
1c5d0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1c5e0 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
1c5f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1c600 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
1c610 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
1c620 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1c630 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
1c640 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1c650 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
1c660 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
1c670 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1c680 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
1c690 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
1c6a0 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
1c6b0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
1c6c0 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
1c6d0 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
1c6e0 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
1c6f0 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
1c700 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
1c710 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
1c720 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
1c730 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
1c740 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c750 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
1c760 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
1c770 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
1c780 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
1c790 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
1c7a0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1c7b0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c7c0 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
1c7d0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1c7e0 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
1c7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c800 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
1c810 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c820 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1c830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c840 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
1c850 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
1c860 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
1c870 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1c880 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c890 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1c8a0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1c8b0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1c8c0 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
1c8d0 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
1c8e0 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1c8f0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
1c900 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
1c910 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
1c920 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1c930 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
1c940 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
1c950 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
1c960 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1c970 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1c980 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1c990 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1c9a0 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
1c9b0 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
1c9c0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
1c9d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c9e0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1c9f0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
1ca00 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
1ca10 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
1ca20 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
1ca30 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1ca40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1ca50 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1ca60 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
1ca70 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1ca80 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
1ca90 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1caa0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
1cab0 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
1cac0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
1cad0 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1cae0 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
1caf0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
1cb00 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
1cb10 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
1cb20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
1cb30 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
1cb40 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
1cb50 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
1cb60 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
1cb70 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
1cb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1cb90 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
1cba0 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
1cbb0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1cbc0 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
1cbd0 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
1cbe0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1cbf0 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
1cc00 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
1cc10 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
1cc20 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1cc30 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1cc40 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
1cc50 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
1cc60 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
1cc70 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
1cc80 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
1cc90 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
1cca0 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
1ccb0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1ccc0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
1ccd0 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
1cce0 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
1ccf0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1cd00 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
1cd10 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
1cd20 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
1cd30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
1cd40 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1cd50 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
1cd60 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
1cd70 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
1cd80 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
1cd90 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
1cda0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cdb0 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
1cdc0 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
1cdd0 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
1cde0 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
1cdf0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
1ce00 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
1ce10 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
1ce20 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
1ce30 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
1ce40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
1ce50 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1ce60 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
1ce70 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
1ce80 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
1ce90 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
1cea0 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
1ceb0 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
1cec0 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
1ced0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
1cee0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1cef0 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
1cf00 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
1cf10 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
1cf20 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
1cf30 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
1cf40 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
1cf50 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
1cf60 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
1cf70 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
1cf80 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
1cf90 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
1cfa0 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
1cfb0 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
1cfc0 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
1cfd0 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
1cfe0 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
1cff0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1d000 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
1d010 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
1d020 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
1d030 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
1d040 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
1d050 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1d060 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
1d070 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
1d080 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1d090 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1d0a0 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
1d0b0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1d0c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1d0d0 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
1d0e0 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
1d0f0 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
1d100 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
1d110 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
1d120 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
1d130 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
1d140 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1d150 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
1d160 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
1d170 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
1d180 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
1d190 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
1d1a0 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
1d1b0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
1d1c0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
1d1d0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
1d1e0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
1d1f0 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
1d200 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1d210 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
1d220 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
1d230 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
1d240 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
1d250 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d260 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d270 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1d280 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
1d290 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
1d2a0 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
1d2b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d2c0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
1d2d0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
1d2e0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
1d2f0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
1d300 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
1d310 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
1d320 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1d330 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
1d340 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
1d350 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
1d360 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
1d370 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
1d380 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
1d390 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
1d3a0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
1d3b0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
1d3c0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
1d3d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1d3e0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1d3f0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1d400 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1d410 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
1d420 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d430 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1d440 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1d450 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
1d460 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1d470 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1d480 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1d490 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1d4a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d4b0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
1d4c0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
1d4d0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
1d4e0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
1d4f0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
1d510 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
1d520 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
1d530 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1d540 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d550 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1d560 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
1d570 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
1d580 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1d590 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1d5a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
1d5b0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
1d5c0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d5d0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1d5e0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1d5f0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1d600 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1d610 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1d620 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d630 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
1d640 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
1d650 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1d660 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1d670 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1d680 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1d690 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1d6a0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1d6b0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
1d6c0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1d6d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d6e0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1d6f0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1d700 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d710 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
1d720 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1d730 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
1d740 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1d750 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
1d760 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d770 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
1d780 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1d790 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d7a0 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
1d7b0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1d7c0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1d7d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
1d7e0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
1d7f0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
1d800 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1d810 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
1d820 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
1d830 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
1d840 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1d850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
1d860 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
1d870 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
1d880 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
1d890 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
1d8a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
1d8b0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
1d8c0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d8d0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
1d8e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d8f0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1d900 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
1d910 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d930 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d940 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
1d950 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1d960 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
1d970 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
1d980 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d990 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
1d9a0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
1d9b0 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
1d9c0 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
1d9d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
1d9e0 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
1d9f0 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
1da00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
1da10 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
1da20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
1da30 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
1da40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
1da50 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1da60 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
1da70 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
1da80 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
1da90 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
1daa0 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
1dab0 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
1dac0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
1dad0 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
1dae0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
1daf0 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70   && pLoop->nSkip
1db00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1db10 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ((i = pLoop->aLT
1db20 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
1db30 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  r) & (WO_EQ|WO_I
1db40 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30  SNULL|WO_IS))!=0
1db50 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1db60 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
1db70 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1db80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1db90 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1dba0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1dbb0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1dbc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1dbd0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1dbe0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
1dbf0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
1dc00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1dc10 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
1dc20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
1dc30 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
1dc40 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
1dc50 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1dc60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
1dc70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dc80 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1dc90 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
1dca0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1dcb0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1dcc0 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
1dcd0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
1dce0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1dcf0 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
1dd00 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
1dd10 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
1dd20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dd30 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
1dd40 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1dd50 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1dd60 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1dd70 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1dd80 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1dd90 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1dda0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1ddb0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1ddc0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1ddd0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1dde0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ddf0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1de00 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1de10 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1de20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1de30 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1de40 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1de50 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1de60 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1de70 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1de80 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1de90 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1dea0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1deb0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1dec0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1ded0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1dee0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1def0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1df00 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1df10 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1df20 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1df30 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1df40 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1df50 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1df60 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1df70 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1df80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1df90 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1dfa0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1dfb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1dfc0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1dfd0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1dfe0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1dff0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1e000 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1e010 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1e020 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1e030 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1e040 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1e050 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1e060 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1e070 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1e080 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1e090 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1e0a0 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1e0b0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
1e0c0 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
1e0d0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1e0e0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1e0f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e100 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1e110 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1e120 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e130 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1e140 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1e150 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1e160 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
1e170 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e180 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1e190 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
1e1a0 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
1e1b0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
1e1c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1e1d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1e1e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e200 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
1e210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e220 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1e230 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1e240 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1e250 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1e260 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e270 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1e280 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1e290 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e2a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e2b0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
1e2c0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
1e2d0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1e2e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e2f0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1e300 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1e310 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1e320 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1e330 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
1e340 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1e350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e360 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1e370 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
1e380 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
1e390 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1e3a0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
1e3b0 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
1e3c0 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
1e3d0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1e3e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1e3f0 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
1e400 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
1e410 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
1e420 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1e430 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
1e440 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1e450 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e460 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
1e470 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1e480 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
1e490 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
1e4a0 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
1e4b0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
1e4c0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
1e4d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1e4e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e4f0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
1e500 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e510 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1e520 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e530 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
1e540 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
1e550 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
1e560 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
1e570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
1e580 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1e590 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
1e5a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e5b0 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
1e5c0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1e5d0 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
1e5e0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1e5f0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1e600 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
1e610 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1e620 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1e630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e640 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e660 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
1e670 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
1e680 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
1e690 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1e6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e6b0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1e6c0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
1e6d0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1e6e0 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
1e6f0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
1e700 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
1e710 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
1e720 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
1e730 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
1e740 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
1e750 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
1e760 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1e770 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
1e780 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
1e790 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
1e7a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1e7b0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1e7c0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
1e7d0 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
1e7e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
1e7f0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1e800 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e810 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
1e820 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
1e830 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
1e840 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
1e850 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
1e860 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
1e870 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
1e880 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
1e890 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
1e8a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e8b0 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
1e8c0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
1e8d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e8e0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1e8f0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1e900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e910 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
1e920 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
1e930 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
1e940 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
1e950 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
1e960 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
1e970 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
1e980 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
1e990 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1e9a0 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
1e9b0 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
1e9c0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1e9d0 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
1e9e0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
1e9f0 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
1ea00 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
1ea10 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ea20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
1ea30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
1ea40 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
1ea50 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
1ea60 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
1ea70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1ea80 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
1ea90 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1eaa0 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
1eab0 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
1eac0 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
1ead0 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
1eae0 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
1eaf0 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
1eb00 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
1eb10 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
1eb20 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
1eb30 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
1eb40 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1eb50 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
1eb60 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
1eb70 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
1eb80 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
1eb90 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
1eba0 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
1ebb0 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
1ebc0 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
1ebd0 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
1ebe0 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
1ebf0 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
1ec00 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
1ec10 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
1ec20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
1ec30 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1ec40 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
1ec50 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1ec60 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
1ec70 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1ec80 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
1ec90 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
1eca0 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
1ecb0 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
1ecc0 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
1ecd0 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
1ece0 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
1ecf0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
1ed00 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
1ed10 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1ed20 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1ed30 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
1ed40 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
1ed50 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
1ed60 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
1ed70 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
1ed80 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
1ed90 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1eda0 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
1edb0 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
1edc0 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
1edd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
1ede0 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
1edf0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1ee00 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ee10 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ee20 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
1ee30 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ee40 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ee50 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
1ee60 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
1ee70 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
1ee80 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1ee90 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
1eea0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
1eeb0 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
1eec0 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
1eed0 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
1eee0 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
1eef0 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
1ef00 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
1ef10 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
1ef20 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1ef30 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
1ef40 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
1ef50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
1ef60 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
1ef70 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
1ef80 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
1ef90 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
1efa0 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
1efb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1efc0 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
1efd0 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
1efe0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
1eff0 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
1f000 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
1f010 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
1f020 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
1f030 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
1f040 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
1f050 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
1f060 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
1f070 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1f080 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
1f090 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
1f0a0 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
1f0b0 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
1f0c0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
1f0d0 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
1f0e0 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
1f0f0 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
1f100 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1f110 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
1f120 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
1f130 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
1f140 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
1f150 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
1f160 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
1f170 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
1f180 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
1f190 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
1f1a0 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
1f1b0 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
1f1c0 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
1f1d0 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
1f1e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
1f1f0 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
1f200 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
1f210 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
1f220 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
1f230 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
1f240 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
1f250 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
1f260 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
1f270 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
1f280 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1f290 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
1f2a0 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
1f2b0 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
1f2c0 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
1f2d0 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
1f2e0 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
1f2f0 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
1f300 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52  nRow + estLog(nR
1f310 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  ow) + rScale + 1
1f320 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  6;..  /* TUNING:
1f330 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70   The cost of imp
1f340 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e  lementing DISTIN
1f350 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45  CT using a B-TRE
1f360 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61  E is.  ** simila
1f370 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61 72  r but with a lar
1f380 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20  ger constant of 
1f390 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e  proportionality.
1f3a0 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20   .  ** Multiply 
1f3b0 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
1f3c0 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20   factor of 3.0. 
1f3d0 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
1f3e0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1f3f0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
1f400 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74 43  CT ){.    rSortC
1f410 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a  ost += 16;.  }..
1f420 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
1f430 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
1f440 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
1f450 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1f460 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
1f470 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
1f480 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
1f490 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
1f4a0 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
1f4b0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
1f4c0 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
1f4d0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
1f4e0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
1f4f0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
1f500 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
1f510 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
1f520 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1f530 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
1f540 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
1f550 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
1f560 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
1f570 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
1f580 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
1f590 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
1f5a0 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
1f5b0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
1f5c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f5d0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
1f5e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
1f5f0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f600 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
1f610 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f620 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
1f630 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
1f640 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
1f650 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
1f660 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
1f670 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
1f680 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
1f690 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
1f6a0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
1f6b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f6c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1f6d0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
1f6e0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1f6f0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
1f700 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1f710 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
1f720 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1f730 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f740 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f750 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
1f760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f770 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
1f780 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1f790 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
1f7a0 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
1f7b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f7c0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
1f7d0 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
1f7e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f7f0 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
1f800 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
1f810 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1f820 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f830 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
1f840 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
1f850 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
1f860 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1f870 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
1f880 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
1f890 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
1f8a0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
1f8b0 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
1f8c0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
1f8d0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
1f8e0 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
1f8f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1f900 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
1f910 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
1f920 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
1f930 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
1f940 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
1f950 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
1f960 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
1f970 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
1f980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f990 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
1f9a0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
1f9b0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
1f9c0 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
1f9d0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
1f9e0 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
1f9f0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1fa00 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
1fa10 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
1fa20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
1fa30 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
1fa40 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1fa50 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1fa60 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
1fa70 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
1fa80 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
1fa90 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
1faa0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
1fab0 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
1fac0 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
1fad0 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
1fae0 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
1faf0 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
1fb00 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
1fb10 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
1fb20 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
1fb30 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1fb40 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
1fb50 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
1fb60 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb80 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
1fb90 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
1fba0 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
1fbb0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1fbc0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
1fbd0 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
1fbe0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
1fbf0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
1fc00 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
1fc10 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
1fc20 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
1fc30 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
1fc40 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
1fc50 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
1fc60 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
1fc70 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
1fc80 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
1fc90 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
1fca0 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
1fcb0 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
1fcc0 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
1fcd0 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
1fce0 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
1fcf0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
1fd00 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
1fd10 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
1fd20 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
1fd30 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
1fd40 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
1fd50 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
1fd60 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1fd70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fd80 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
1fd90 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
1fda0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
1fdb0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
1fdc0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
1fdd0 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1fde0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
1fdf0 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
1fe00 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
1fe10 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1fe20 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
1fe30 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
1fe40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
1fe50 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
1fe60 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
1fe70 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
1fe80 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
1fe90 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
1fea0 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
1feb0 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
1fec0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
1fed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fee0 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
1fef0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1ff00 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
1ff10 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1ff20 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
1ff30 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
1ff40 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
1ff50 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
1ff60 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
1ff70 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
1ff80 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
1ff90 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
1ffa0 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
1ffb0 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
1ffc0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ffd0 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63 65  ocRaw(db, nSpace
1ffe0 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
1fff0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
20000 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
20010 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
20020 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
20030 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
20040 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
20050 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
20060 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
20070 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
20080 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
20090 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
200a0 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
200b0 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
200c0 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
200d0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
200e0 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  pX;.  }.  if( nO
200f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
20100 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
20110 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20120 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65  and it is not be
20130 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74  ing ignored, set
20140 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65   up.    ** space
20150 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f   for the aSortCo
20160 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68  st[] array. Each
20170 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
20180 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a  aSortCost array.
20190 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
201a0 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20   zero - meaning 
201b0 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
201c0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
201d0 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  - or the.    ** 
201e0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
201f0 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20  nRowEst rows of 
20200 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66  data where the f
20210 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a  irst X terms of.
20220 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
20230 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61   BY clause are a
20240 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c  lready in order,
20250 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20   where X is the 
20260 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e  array .    ** in
20270 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f  dex.  */.    aSo
20280 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74  rtCost = (LogEst
20290 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74  *)pX;.    memset
202a0 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73  (aSortCost, 0, s
202b0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
202c0 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  nOrderBy);.  }. 
202d0 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
202e0 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st==0 || &pSpace
202f0 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
20300 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64  )&aSortCost[nOrd
20310 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72  erBy] );.  asser
20320 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20  t( aSortCost!=0 
20330 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
20340 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b  e]==(char*)pX );
20350 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
20360 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
20370 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
20380 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
20390 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
203a0 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
203b0 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
203c0 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
203d0 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49   go above 28.  I
203e0 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
203f0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
20400 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
20410 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
20420 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
20430 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 28.  ** rows, 
20440 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
20450 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
20460 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
20470 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
20480 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
20490 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20  , 48);  assert( 
204a0 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  48==sqlite3LogEs
204b0 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(28) );.  nFrom
204c0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
204d0 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
204e0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ed==0 );.  if( n
204f0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
20500 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65  * If nLoop is ze
20510 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ro, then there a
20520 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73  re no FROM terms
20530 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53   in the query. S
20540 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ince.    ** in t
20550 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65  his case the que
20560 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20  ry may return a 
20570 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72  maximum of one r
20580 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ow, the results.
20590 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
205a0 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  dy in the reques
205b0 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69  ted order. Set i
205c0 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64  sOrdered to nOrd
205d0 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69  erBy to.    ** i
205e0 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72  ndicate this. Or
205f0 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72  , if nLoop is gr
20600 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
20610 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   set isOrdered t
20620 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64  o.    ** -1, ind
20630 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
20640 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20   result set may 
20650 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72  or may not be or
20660 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64  dered, .    ** d
20670 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
20680 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74  loops added to t
20690 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e  he current plan.
206a0 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30    */.    aFrom[0
206b0 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
206c0 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72  oop>0 ? -1 : nOr
206d0 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
206e0 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
206f0 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
20700 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
20710 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
20720 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
20730 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
20740 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
20750 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
20760 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
20770 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
20780 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
20790 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
207a0 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
207b0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
207c0 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
207d0 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
207e0 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
207f0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
20800 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
20810 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
20820 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
20830 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
20840 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
20850 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20   nOut;          
20860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20870 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28  ows visited by (
20880 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
20890 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
208a0 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  rCost;          
208b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
208c0 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f  st of path (pFro
208d0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
208e0 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73       LogEst rUns
208f0 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  orted;          
20900 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
20910 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f  ed cost of (pFro
20920 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
20930 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65       i8 isOrdere
20940 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
20950 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65  ered;  /* isOrde
20960 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70  red for (pFrom+p
20970 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
20980 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
20990 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
209a0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
209b0 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e  rc visited by (.
209c0 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  .) */.        Bi
209d0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
209e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
209f0 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f  /* Mask of rev-o
20a00 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28  rder loops for (
20a10 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ..) */..        
20a20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
20a30 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
20a40 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
20a50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
20a60 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
20a70 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
20a80 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
20a90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
20aa0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
20ab0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
20ac0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
20ad0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
20ae0 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
20af0 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
20b00 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
20b10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
20b20 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
20b30 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
20b40 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
20b50 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
20b60 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
20b70 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
20b80 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
20b90 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
20ba0 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
20bb0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
20bc0 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
20bd0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
20be0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
20bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
20c00 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
20c10 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
20c20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
20c30 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
20c40 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
20c50 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20c60 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
20c70 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
20c80 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20ca0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
20cb0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
20cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20cd0 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
20ce0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
20cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20d00 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
20d10 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
20d20 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
20d30 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
20d40 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
20d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
20d60 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20d70 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
20d80 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
20d90 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
20da0 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
20db0 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
20dc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20de0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
20df0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
20e00 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
20e10 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
20e20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
20e30 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
20e40 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
20e50 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
20e60 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
20e70 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
20e80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20e90 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
20ea0 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
20eb0 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
20ec0 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
20ed0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
20ee0 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
20ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f00 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
20f10 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
20f20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
20f30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
20f40 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
20f50 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
20f60 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
20f70 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
20f80 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
20f90 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20fa0 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
20fb0 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
20fc0 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
20fd0 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
20fe0 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
20ff0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
21000 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
21010 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
21020 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
21030 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
21040 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
21050 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
21060 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
21070 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
21080 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
21090 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
210a0 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
210b0 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
210c0 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
210d0 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
210e0 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
210f0 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
21100 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
21110 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
21120 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21130 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
21140 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
21150 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
21160 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
21170 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
21180 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
21190 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
211a0 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
211b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
211c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
211d0 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
211e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
211f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
21200 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21210 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
21220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21230 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
21240 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
21250 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
21260 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
21270 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
21280 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
21290 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
212a0 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
212b0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
212c0 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
212d0 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
212e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
212f0 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
21300 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
21310 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
21320 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
21330 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
21340 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
21350 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
21360 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
21370 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
21380 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
21390 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
213a0 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
213b0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
213c0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
213d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
213e0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21400 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21410 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
21420 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21430 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21440 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
21450 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
21460 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
21470 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
21480 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
21490 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
214a0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
214b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
214c0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
214d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
214e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
214f0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
21500 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
21510 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
21520 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
21530 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
21540 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
21550 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
21560 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
21570 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
21580 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
21590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
215a0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
215b0 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
215c0 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
215d0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
215e0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
215f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21600 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
21610 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
21620 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
21630 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
21640 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
21650 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
21660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21670 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
21680 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
21690 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
216a0 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
216b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
216c0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
216d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
216e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
216f0 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
21700 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
21710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21720 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
21730 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
21740 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
21750 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
21760 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
21770 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
21780 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
21790 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
217a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
217b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
217c0 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
217d0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
217e0 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f  h pTo=aTo[jj] co
217f0 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20  vers the.       
21800 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f     ** same set o
21810 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
21820 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65  the sam isOrdere
21830 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
21840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
21850 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
21860 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
21870 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
21880 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
21890 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
218a0 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
218b0 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
218c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
218d0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
218e0 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
218f0 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54  ost==rCost && pT
21900 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29  o->nRow<=nOut) )
21910 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
21920 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
21930 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
21940 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
21950 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21970 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21990 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
219a0 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
219b0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
219c0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
219d0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
219e0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
219f0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21a10 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21a20 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21a30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21a40 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21a50 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
21a60 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
21a70 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
21a80 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
21a90 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
21aa0 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
21ab0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ad0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
21ae0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
21af0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
21b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
21b10 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
21b20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
21b30 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
21b40 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
21b50 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
21b60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21b70 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
21b80 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
21b90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21bb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21bc0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
21bd0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
21be0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
21bf0 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
21c00 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
21c10 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
21c20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
21c30 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
21c40 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
21c50 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
21c60 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
21c70 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
21c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21c90 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
21ca0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
21cb0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21cc0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
21cd0 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
21ce0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21cf0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21d00 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
21d10 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
21d20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
21d30 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21d50 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21d60 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21d80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21d90 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
21da0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21db0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21dc0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21dd0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21de0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21df0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
21e10 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
21e20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
21e30 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
21e40 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21e60 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
21e70 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
21e80 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
21e90 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
21ea0 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
21eb0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
21ec0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
21ed0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
21ee0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
21ef0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
21f00 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
21f10 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
21f20 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
21f30 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
21f40 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
21f50 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
21f60 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
21f70 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
21f80 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
21f90 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
21fa0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
21fb0 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
21fc0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
21fd0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
21fe0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
21ff0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
22000 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
22010 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
22020 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
22030 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
22040 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
22050 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
22060 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
22070 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
22080 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
22090 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
220a0 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
220b0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
220c0 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
220d0 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
220e0 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
220f0 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
22100 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22110 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
22120 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
22130 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
22140 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
22150 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
22160 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
22170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22190 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
221a0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
221b0 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
221c0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
221d0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
221e0 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
221f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22200 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
22210 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
22220 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
22230 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
22240 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
22250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
22260 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22270 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
22280 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
22290 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
222a0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
222b0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
222c0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
222d0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
222e0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
222f0 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
22300 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
22310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
22320 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
22330 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22340 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22350 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
22360 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
22370 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
22390 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
223a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
223b0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
223c0 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
223d0 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
223e0 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
223f0 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
22400 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
22410 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
22420 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
22430 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
22440 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
22450 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
22460 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
22470 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
22480 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
22490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
224a0 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
224b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
224c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
224d0 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
224e0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
224f0 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
22500 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
22510 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
22520 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
22530 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
22540 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
22550 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
22560 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
22570 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
22580 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
22590 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
225a0 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
225b0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
225c0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
225d0 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
225e0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
225f0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
22600 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
22610 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
22620 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
22630 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
22640 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
22650 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
22660 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
22670 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
22680 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
22690 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
226a0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
226b0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
226c0 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
226d0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
226e0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
226f0 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
22700 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
22710 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22720 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
22730 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
22740 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
22750 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
22760 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
22770 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
22780 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
22790 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
227a0 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
227b0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
227c0 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
227e0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
227f0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
22800 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
22810 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
22820 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
22830 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
22840 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
22850 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22860 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
22870 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
22880 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
22890 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
228a0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
228b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
228c0 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
228d0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
228e0 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
228f0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
22900 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
22910 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22920 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
22930 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
22940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22950 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
22960 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
22970 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
22980 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20  nfo->nOBSat<0 ) 
22990 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
229a0 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   0;.      pWInfo
229b0 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
229c0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
229d0 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
229e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
229f0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
22a00 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
22a10 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
22a20 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
22a30 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
22a40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
22a50 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
22a60 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
22a70 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
22a80 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
22a90 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
22aa0 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
22ab0 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
22ac0 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
22ad0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
22ae0 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
22af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22b00 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
22b10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
22b20 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
22b30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
22b40 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
22b50 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
22b60 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
22b70 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
22b80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22b90 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
22ba0 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
22bb0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
22bc0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
22bd0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
22be0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
22bf0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
22c00 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
22c10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22c20 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
22c30 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
22c40 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
22c50 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
22c60 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
22c70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
22c80 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
22c90 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
22ca0 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
22cb0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
22cc0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
22cd0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
22ce0 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
22cf0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
22d00 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
22d10 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
22d20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
22d30 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
22d40 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
22d50 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
22d60 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
22d70 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
22d80 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
22d90 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
22da0 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
22db0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
22dc0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
22dd0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
22de0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
22df0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
22e00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22e10 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
22e20 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
22e30 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
22e40 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
22e50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22e60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22e70 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
22e80 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
22e90 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
22ea0 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
22eb0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
22ec0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22ed0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
22ee0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
22ef0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
22f00 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
22f10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
22f20 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
22f30 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
22f40 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22f50 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
22f60 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
22f70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
22f80 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
22f90 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
22fa0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
22fb0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
22fc0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
22fd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
22fe0 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
22ff0 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
23000 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
23010 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
23020 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
23030 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
23040 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
23050 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
23060 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
23070 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
23080 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
23090 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
230a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
230b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
230c0 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
230d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
230e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
230f0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
23100 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
23110 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
23120 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
23130 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
23140 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
23150 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
23160 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
23170 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
23180 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
23190 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
231a0 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
231b0 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
231c0 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
231d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
231e0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
231f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
23200 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
23210 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
23220 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
23230 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
23240 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
23250 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
23260 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
23270 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
23280 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
23290 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
232a0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
232b0 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
232c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
232d0 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
232e0 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
232f0 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
23300 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
23310 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
23320 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
23330 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
23340 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
23350 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
23360 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
23370 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
23380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
23390 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
233a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
233b0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
233c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
233d0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
233e0 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
233f0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
23400 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
23410 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
23420 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
23430 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
23440 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
23450 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
23460 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
23470 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
23480 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
23490 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
234a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
234b0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
234c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
234d0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
234e0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
234f0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
23500 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
23510 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
23520 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
23530 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
23540 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
23550 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
23560 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
23570 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
23580 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
23590 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
235a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
235b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
235c0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
235d0 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
235e0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
235f0 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
23600 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
23610 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lf = sqlite3Wher
23620 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
23630 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
23640 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
23650 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
23660 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
23670 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
23680 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
23690 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
236a0 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
236b0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
236c0 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
236d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
236e0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
236f0 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
23700 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
23710 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
23720 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
23730 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
23740 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
23750 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
23760 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
23770 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23780 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
23790 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
237a0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
237b0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
237c0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
237d0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
237e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
237f0 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
23800 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
23810 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
23820 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
23830 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
23840 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
23850 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
23860 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
23870 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
23880 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
23890 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
238a0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
238b0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
238c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
238d0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
238e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
238f0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
23900 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
23910 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
23920 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
23930 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
23940 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
23950 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
23960 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
23970 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
23980 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
23990 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
239a0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
239b0 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
239c0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
239d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
239e0 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
239f0 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
23a00 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
23a10 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
23a20 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
23a30 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
23a40 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
23a50 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
23a60 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
23a70 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
23a80 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
23a90 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
23aa0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23ab0 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
23ac0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
23ad0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23ae0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23af0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
23b00 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
23b10 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
23b20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
23b30 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
23b50 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23b60 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23b90 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
23ba0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bc0 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
23bd0 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
23be0 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
23bf0 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
23c00 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
23c10 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
23c20 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
23c30 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
23c40 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
23c50 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
23c60 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
23c70 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
23c80 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
23c90 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
23ca0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
23cb0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
23cc0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
23cd0 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
23ce0 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
23cf0 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
23d00 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
23d10 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
23d20 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
23d30 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
23d40 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
23d50 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
23d60 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
23d70 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
23d80 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
23d90 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
23da0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
23db0 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
23dc0 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
23dd0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
23de0 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
23df0 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
23e00 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
23e10 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
23e20 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
23e30 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
23e40 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
23e50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23e60 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
23e70 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
23e80 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
23e90 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
23ea0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
23eb0 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
23ec0 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
23ed0 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
23ee0 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
23ef0 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
23f00 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
23f10 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
23f20 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
23f30 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
23f40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
23f50 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
23f60 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
23f70 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
23f80 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
23f90 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
23fa0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
23fb0 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
23fc0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
23fd0 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
23fe0 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
23ff0 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
24000 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
24010 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
24020 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
24030 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
24040 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
24050 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
24060 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
24070 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
24080 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
24090 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
240a0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
240b0 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
240c0 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
240d0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
240e0 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
240f0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
24100 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
24110 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
24120 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
24130 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
24140 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
24150 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
24160 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
24170 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
24180 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
24190 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
241a0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
241b0 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
241c0 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
241d0 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
241e0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
241f0 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
24200 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
24210 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
24220 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
24230 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
24240 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
24250 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
24260 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
24270 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
24280 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
24290 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
242a0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
242b0 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
242c0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
242d0 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
242e0 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
242f0 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
24300 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
24310 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
24320 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
24330 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
24340 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
24350 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
24360 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
24370 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
24380 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
24390 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
243a0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
243b0 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
243c0 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
243d0 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
243e0 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
243f0 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
24400 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24410 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
24420 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
24430 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
24440 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
24450 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
24460 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
24470 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24480 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
24490 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
244a0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
244b0 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
244c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
244d0 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
244e0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
244f0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
24500 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
24510 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75  **.** The iIdxCu
24520 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
24530 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
24540 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49   of an index.  I
24550 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  f .** WHERE_ONET
24560 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
24570 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65  , iIdxCur is the
24580 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
24590 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f  f an index.** to
245a0 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75   use for OR clau
245b0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
245c0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
245d0 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73   should use this
245e0 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72  .** specific cur
245f0 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f  sor.  If WHERE_O
24600 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69  NEPASS_DESIRED i
24610 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78  s set, then iIdx
24620 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  Cur is.** the fi
24630 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e  rst cursor in an
24640 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72   array of cursor
24650 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
24660 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75  s.  iIdxCur shou
24670 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ld.** be used to
24680 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70   compute the app
24690 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20  ropriate cursor 
246a0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69  depending on whi
246b0 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75  ch index is.** u
246c0 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  sed..*/.WhereInf
246d0 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
246e0 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
246f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
24700 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
24710 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
24720 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
24730 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
24740 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
24750 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
24760 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
24770 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
24780 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24790 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
247a0 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
247b0 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
247c0 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
247d0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
247e0 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
247f0 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
24800 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
24810 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
24820 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
24830 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
24840 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
24850 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
24860 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
24870 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
24880 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
24890 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
248a0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
248b0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
248c0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
248d0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
248e0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
248f0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
24900 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24920 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
24930 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
24940 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
24950 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
24960 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
24970 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
24980 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
24990 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
249a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
249b0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
249c0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
249d0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
249e0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
249f0 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
24a00 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
24a10 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
24a20 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
24a30 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
24a40 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
24a50 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
24a60 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
24a70 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
24a80 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
24a90 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
24aa0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
24ab0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
24ac0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
24ad0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
24ae0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
24af0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
24b00 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
24b10 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
24b40 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
24b50 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
24b60 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
24b80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24ba0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
24bb0 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
24bc0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
24bd0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30  ASS_MULTIROW)==0
24be0 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77   || (.        (w
24bf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
24c00 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
24c10 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28  D)!=0 .     && (
24c20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24c30 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
24c40 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20  SE)==0 .  ));.. 
24c50 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
24c60 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
24c70 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
24c80 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
24c90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
24ca0 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44  ));..  /* An ORD
24cb0 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ER/GROUP BY clau
24cc0 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20  se of more than 
24cd0 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20  63 terms cannot 
24ce0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a  be optimized */.
24cf0 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64    testcase( pOrd
24d00 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
24d10 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29  ->nExpr==BMS-1 )
24d20 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
24d30 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
24d40 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65  xpr>=BMS ) pOrde
24d50 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e  rBy = 0;.  sWLB.
24d60 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
24d70 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
24d80 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
24d90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
24da0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
24db0 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
24dc0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
24dd0 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
24de0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
24df0 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
24e00 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
24e10 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
24e20 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
24e30 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
24e40 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
24e50 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
24e60 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
24e70 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
24e80 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
24e90 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
24ea0 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
24eb0 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
24ec0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
24ed0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
24ee0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
24ef0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
24f00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
24f10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24f20 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
24f30 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
24f40 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
24f50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
24f60 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
24f70 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
24f80 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
24f90 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
24fa0 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
24fb0 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
24fc0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
24fd0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
24fe0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
24ff0 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
25000 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
25010 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
25020 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
25030 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
25040 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
25050 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
25060 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
25070 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
25080 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
25090 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
250a0 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
250b0 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
250c0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
250d0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
250e0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
250f0 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
25100 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
25110 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
25120 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
25130 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
25140 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
25150 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
25160 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25170 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
25180 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
25190 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
251a0 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
251b0 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
251c0 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
251d0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
251e0 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
251f0 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
25200 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
25210 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
25220 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
25230 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
25240 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
25250 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
25260 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
25270 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
25280 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
25290 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
252a0 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
252b0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
252c0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
252d0 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f  yteWInfo + sizeo
252e0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
252f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25300 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
25310 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25320 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
25330 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
25340 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
25350 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
25360 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
25370 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
25380 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
25390 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
253a0 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
253b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
253c0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
253d0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
253e0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
253f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
25400 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
25410 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
25420 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
25430 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e  o->iBreak = pWIn
25440 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
25450 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25460 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
25470 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
25480 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
25490 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
254a0 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
254b0 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 61 73  nQueryLoop;.  as
254c0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  sert( pWInfo->eO
254d0 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
254e0 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41  OFF );  /* ONEPA
254f0 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f  SS defaults to O
25500 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74  FF */.  pMaskSet
25510 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
25520 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49  kSet;.  sWLB.pWI
25530 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
25540 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e  sWLB.pWC = &pWIn
25550 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e  fo->sWC;.  sWLB.
25560 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f  pNew = (WhereLoo
25570 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e  p*)(((char*)pWIn
25580 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b  fo)+nByteWInfo);
25590 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
255a0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
255b0 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20  sWLB.pNew) );.  
255c0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57  whereLoopInit(sW
255d0 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66  LB.pNew);.#ifdef
255e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
255f0 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d  sWLB.pNew->cId =
25600 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   '*';.#endif..  
25610 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
25620 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
25630 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
25640 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
25650 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
25660 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
25670 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
25680 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
25690 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
256a0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  t);.  sqlite3Whe
256b0 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57  reClauseInit(&pW
256c0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66  Info->sWC, pWInf
256d0 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  o);.  sqlite3Whe
256e0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
256f0 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
25700 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a  _AND);.    .  /*
25710 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
25720 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
25730 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
25740 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
25750 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
25760 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
25770 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
25780 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
25790 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
257a0 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e  ; ii<sWLB.pWC->n
257b0 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
257c0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
257d0 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
257e0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
257f0 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d  (sWLB.pWC->a[ii]
25800 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
25810 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
25820 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42  lse(pParse, sWLB
25830 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
25840 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  r, pWInfo->iBrea
25850 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
25860 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25870 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
25880 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e        sWLB.pWC->
25890 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d  a[ii].wtFlags |=
258a0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
258b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65   }.  }..  /* Spe
258c0 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
258d0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
258e0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
258f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
25900 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
25910 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
25920 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
25930 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
25940 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
25950 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
25960 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
25970 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
25980 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
25990 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
259a0 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
259b0 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
259c0 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
259d0 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
259e0 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66  The N-th term of
259f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25a00 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62   is assigned a b
25a10 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a  itmask of 1<<N..
25a20 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75    **.  ** The ru
25a30 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  le of the previo
25a40 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75  us sentence ensu
25a50 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73  res thta if X is
25a60 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
25a70 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c  .  ** a table T,
25a80 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65   then X-1 is the
25a90 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
25aa0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
25ab0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a   the left of T..
25ac0 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
25ad0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
25ae0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
25af0 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
25b00 69 6e 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6f 72  in is.  ** impor
25b10 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
25b20 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
25b30 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
25b40 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
25b50 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
25b60 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
25b70 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
25b80 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
25b90 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
25ba0 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
25bb0 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
25bc0 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
25bd0 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
25be0 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
25bf0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
25c00 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
25c10 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
25c20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
25c30 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
25c40 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
25c50 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
25c60 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
25c70 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
25c80 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46  sqlite3WhereTabF
25c90 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20  uncArgs(pParse, 
25ca0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d  &pTabList->a[ii]
25cb0 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
25cc0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
25cd0 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
25ce0 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
25cf0 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
25d00 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73     Bitmask m = s
25d10 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
25d20 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
25d30 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
25d40 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72  rsor);.    asser
25d50 74 28 20 6d 3d 3d 4d 41 53 4b 42 49 54 28 69 69  t( m==MASKBIT(ii
25d60 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) );.  }.#endif.
25d70 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
25d80 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
25d90 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  essions. */.  sq
25da0 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e  lite3WhereExprAn
25db0 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
25dc0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
25dd0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25de0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
25df0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
25e00 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
25e10 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
25e20 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28  TINCT ){.    if(
25e30 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
25e40 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
25e50 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
25e60 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29  sWC, pResultSet)
25e70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
25e80 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
25e90 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
25ea0 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
25eb0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
25ec0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
25ed0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
25ee0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
25ef0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
25f00 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
25f10 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
25f20 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
25f30 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
25f40 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
25f50 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
25f60 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
25f70 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
25f80 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
25f90 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
25fa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
25fb0 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
25fc0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
25fd0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
25fe0 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
25ff0 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28  izer Start *** (
26000 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78  wctrlFlags: 0x%x
26010 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
26020 20 20 20 77 63 74 72 6c 46 6c 61 67 73 29 29 3b     wctrlFlags));
26030 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
26040 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
26050 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
26060 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
26070 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61   ){ /* Display a
26080 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
26090 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
260a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
260b0 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70  or(i=0; i<sWLB.p
260c0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  WC->nTerm; i++){
260d0 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d  .      whereTerm
260e0 50 72 69 6e 74 28 26 73 57 4c 42 2e 70 57 43 2d  Print(&sWLB.pWC-
260f0 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d  >a[i], i);.    }
26100 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
26110 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
26120 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
26130 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
26140 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
26150 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
26160 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26170 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
26180 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45  .  .#ifdef WHERE
26190 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
261a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
261b0 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a  reTrace ){    /*
261c0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
261d0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
261e0 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57  jects */.      W
261f0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
26200 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
26210 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
26220 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
26230 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
26240 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
26250 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
26290 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
262a0 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
262b0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
262c0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
262d0 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
262e0 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
262f0 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
26300 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
26310 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
26320 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
26330 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
26340 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
26350 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
26360 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
26370 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
26380 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
26390 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
263a0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
263b0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
263c0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
263d0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
263e0 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
263f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
26400 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
26410 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
26420 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
26430 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
26440 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
26450 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
26460 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
26470 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d  >revMask = (Bitm
26480 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20  ask)(-1);.  }.  
26490 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
264a0 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
264b0 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
264c0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
264d0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
264e0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
264f0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
26500 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
26510 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
26520 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
26530 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
26540 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
26550 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
26560 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  fo->nOBSat>0 ){.
26570 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26580 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
26590 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70  BY=%d,0x%llx", p
265a0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70  WInfo->nOBSat, p
265b0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
265c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
265d0 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
265e0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
265f0 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
26600 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
26610 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26620 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
26630 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
26640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26650 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
26660 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
26670 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
26680 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
26690 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
266a0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
266b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
266c0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
266d0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
266e0 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
266f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
26700 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
26710 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
26720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26730 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
26740 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26750 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
26760 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
26770 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
26780 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
26790 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
267a0 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e  i].pWLoop, sWLB.
267b0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pWC);.    }.  }.
267c0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65  #endif.  /* Atte
267d0 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c  mpt to omit tabl
267e0 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e  es from the join
267f0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66   that do not eff
26800 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a  ect the result *
26810 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
26820 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
26830 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20  pResultSet!=0.  
26840 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
26850 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
26860 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29  TE_OmitNoopJoin)
26870 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
26880 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69  k tabUsed = sqli
26890 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74  te3WhereExprList
268a0 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
268b0 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20  pResultSet);.   
268c0 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72   if( sWLB.pOrder
268d0 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55  By ){.      tabU
268e0 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  sed |= sqlite3Wh
268f0 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65  ereExprListUsage
26900 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
26910 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  pOrderBy);.    }
26920 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
26930 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b  fo->nLevel>=2 ){
26940 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
26950 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
26960 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
26970 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
26980 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70  nLevel-1].pWLoop
26990 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  ;.      if( (pWI
269a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
269b0 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67  [pLoop->iTab].fg
269c0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
269d0 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  EFT)==0 ) break;
269e0 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72  .      if( (wctr
269f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
26a00 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30  ANT_DISTINCT)==0
26a10 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
26a20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
26a30 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20  RE_ONEROW)==0.  
26a40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
26a50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26a60 20 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64      if( (tabUsed
26a70 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
26a80 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  lf)!=0 ) break;.
26a90 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c        pEnd = sWL
26aa0 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e  B.pWC->a + sWLB.
26ab0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
26ac0 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42    for(pTerm=sWLB
26ad0 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  .pWC->a; pTerm<p
26ae0 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
26af0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
26b00 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
26b10 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
26b20 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  =0.         && !
26b30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26b40 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
26b50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
26b60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26b70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
26b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26b90 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20  f( pTerm<pEnd ) 
26ba0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45  break;.      WHE
26bb0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20  RETRACE(0xffff, 
26bc0 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25  ("-> drop loop %
26bd0 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70  c not used\n", p
26be0 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20  Loop->cId));.   
26bf0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65     pWInfo->nLeve
26c00 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c  l--;.      nTabL
26c10 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ist--;.    }.  }
26c20 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
26c30 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
26c40 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
26c50 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f  *\n"));.  pWInfo
26c60 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  ->pParse->nQuery
26c70 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e  Loop += pWInfo->
26c80 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  nRowOut;..  /* I
26c90 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
26ca0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
26cb0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
26cc0 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
26cd0 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
26ce0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
26cf0 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
26d00 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
26d10 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
26d20 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
26d30 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
26d40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
26d50 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20  constrains.  ** 
26d60 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
26d70 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
26d80 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a  e a single row..
26d90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
26da0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26db0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
26dc0 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
26dd0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
26de0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
26df0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
26e00 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a  _DESIRED)!=0 ){.
26e10 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
26e20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  = pWInfo->a[0].p
26e30 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
26e40 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20      int bOnerow 
26e50 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  = (wsFlags & WHE
26e60 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20  RE_ONEROW)!=0;. 
26e70 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c     if( bOnerow |
26e80 7c 20 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  | ( (wctrlFlags 
26e90 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
26ea0 4d 55 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 20  MULTIROW).      
26eb0 20 26 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20   && 0==(wsFlags 
26ec0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
26ed0 41 42 4c 45 29 0a 20 20 20 20 29 29 7b 0a 20 20  ABLE).    )){.  
26ee0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65      pWInfo->eOne
26ef0 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f  Pass = bOnerow ?
26f00 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20   ONEPASS_SINGLE 
26f10 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b  : ONEPASS_MULTI;
26f20 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
26f30 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  wid(pTabList->a[
26f40 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
26f50 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
26f60 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
26f70 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
26f80 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
26f90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65   }.  }..  /* Ope
26fa0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
26fb0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
26fc0 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
26fd0 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
26fe0 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
26ff0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
27000 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
27010 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
27020 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
27030 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
27040 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
27050 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
27060 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
27070 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
27080 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
27090 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
270a0 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
270b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
270c0 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61  abItem;..    pTa
270d0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
270e0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
270f0 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
27100 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
27110 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
27120 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
27130 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
27140 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
27150 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
27160 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
27170 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
27180 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
27190 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
271a0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
271b0 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g */.    }else.#
271c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
271d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
271e0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
271f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27200 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
27210 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
27220 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
27230 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
27240 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
27250 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
27260 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
27270 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
27280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27290 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
272a0 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
272b0 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
272c0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
272d0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
272e0 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a       /* noop */.
272f0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
27300 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
27310 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27320 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
27330 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
27340 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
27350 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
27360 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
27370 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
27380 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
27390 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
273a0 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
273b0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
273c0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
273d0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
273e0 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
273f0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
27400 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
27410 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
27420 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
27430 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
27440 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
27450 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
27460 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
27470 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
27480 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
27490 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
274a0 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
274b0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
274c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
274d0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
274e0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
274f0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
27500 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  S );.      if( p
27510 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
27520 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
27530 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
27540 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
27550 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
27560 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
27570 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
27580 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
27590 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
275a0 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
275b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
275c0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
275d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
275e0 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
275f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27600 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
27610 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
27620 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
27630 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
27640 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
27650 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
27660 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
27670 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c  D_MASK.      sql
27680 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
27690 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
276a0 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e  Used, pTabItem->
276b0 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20  iCursor, 0, 0,. 
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276d0 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
276e0 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d  t u8*)&pTabItem-
276f0 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  >colUsed, P4_INT
27700 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
27710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
27720 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
27730 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
27740 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
27750 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
27760 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
27770 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
27780 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
27790 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
277a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
277b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  ;.      int iInd
277c0 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74  exCur;.      int
277d0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
277e0 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49 64 78  d;.      /* iIdx
277f0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 73 65  Cur is always se
27800 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69  t if to a positi
27810 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50  ve value if ONEP
27820 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ASS is possible 
27830 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
27840 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c 20 28   iIdxCur!=0 || (
27850 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27860 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
27870 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29  SS_DESIRED)==0 )
27880 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73  ;.      if( !Has
27890 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 49  Rowid(pTab) && I
278a0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
278b0 28 70 49 78 29 0a 20 20 20 20 20 20 20 26 26 20  (pIx).       && 
278c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
278d0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
278e0 59 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  Y)!=0.      ){. 
278f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
27900 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e  s one term of an
27910 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR-optimization
27920 20 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41   using the PRIMA
27930 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20  RY KEY of a.    
27940 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52      ** WITHOUT R
27950 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20  OWID table.  No 
27960 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70 61 72  need for a separ
27970 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ate index */.   
27980 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
27990 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
279a0 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30  ;.        op = 0
279b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
279c0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
279d0 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss!=ONEPASS_OFF 
279e0 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
279f0 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d   *pJ = pTabItem-
27a00 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
27a10 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
27a20 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
27a30 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72      assert( wctr
27a40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
27a50 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29  NEPASS_DESIRED )
27a60 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
27a70 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70   ALWAYS(pJ) && p
27a80 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20  J!=pIx ){.      
27a90 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b      iIndexCur++;
27aa0 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20  .          pJ = 
27ab0 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  pJ->pNext;.     
27ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20     }.        op 
27ad0 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
27ae0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
27af0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
27b00 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
27b10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64     }else if( iId
27b20 78 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c  xCur && (wctrlFl
27b30 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
27b40 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  ABLE_ONLY)!=0 ){
27b50 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
27b60 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  ur = iIdxCur;.  
27b70 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46        if( wctrlF
27b80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 4f  lags & WHERE_REO
27b90 50 45 4e 5f 49 44 58 20 29 20 6f 70 20 3d 20 4f  PEN_IDX ) op = O
27ba0 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20  P_ReopenIdx;.   
27bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27bc0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
27bd0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
27be0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
27bf0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
27c00 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
27c10 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
27c20 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
27c30 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
27c40 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
27c50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
27c60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27c70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27c80 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20   op, iIndexCur, 
27c90 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  pIx->tnum, iDb);
27ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27cb0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
27cc0 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
27cd0 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f         if( (pLoo
27ce0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27cf0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
27d00 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
27d10 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
27d20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
27d30 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43  NGE|WHERE_SKIPSC
27d40 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  AN))==0.        
27d50 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
27d60 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
27d70 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20  DERBY_MIN)==0.  
27d80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
27da0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
27db0 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e  _SEEKEQ); /* Hin
27dc0 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20  t to COMDB2 */. 
27dd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27de0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27df0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
27e00 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  e));.#ifdef SQLI
27e10 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
27e20 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
27e30 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
27e40 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a  64 colUsed = 0;.
27e50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
27e60 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  , jj;.          
27e70 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78  for(ii=0; ii<pIx
27e80 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29  ->nColumn; ii++)
27e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  {.            jj
27ea0 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e   = pIx->aiColumn
27eb0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [ii];.          
27ec0 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e    if( jj<0 ) con
27ed0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27ee0 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a     if( jj>63 ) j
27ef0 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20  j = 63;.        
27f00 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65      if( (pTabIte
27f10 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  m->colUsed & MAS
27f20 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63  KBIT(jj))==0 ) c
27f30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27f40 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
27f50 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33  ((u64)1)<<(ii<63
27f60 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20   ? ii : 63);.   
27f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27f90 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
27fa0 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64  olumnsUsed, iInd
27fb0 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20  exCur, 0, 0,.   
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 38               (u8
27fe0 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49  *)&colUsed, P4_I
27ff0 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  NT64);.        }
28000 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
28010 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
28020 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20  USED_MASK */.   
28030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
28040 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69  f( iDb>=0 ) sqli
28050 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
28060 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
28070 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
28080 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
28090 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
280a0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
280b0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
280c0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
280d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
280e0 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
280f0 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
28100 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
28110 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
28120 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
28130 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
28140 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
28150 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
28160 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
28170 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
28180 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
28190 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
281a0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  ++){.    int add
281b0 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e  rExplain;.    in
281c0 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  t wsFlags;.    p
281d0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
281e0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c  >a[ii];.    wsFl
281f0 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  ags = pLevel->pW
28200 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23  Loop->wsFlags;.#
28210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28220 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
28230 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
28240 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
28250 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
28260 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
28270 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
28280 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
28290 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
282a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
282b0 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70    &pTabList->a[p
282c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e  Level->iFrom], n
282d0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
282e0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
282f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
28300 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
28310 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ror;.    }.#endi
28320 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69  f.    addrExplai
28330 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  n = sqlite3Where
28340 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  ExplainOneScan(.
28350 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
28360 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
28370 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
28380 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a  rom, wctrlFlags.
28390 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65      );.    pLeve
283a0 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71  l->addrBody = sq
283b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
283c0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74  Addr(v);.    not
283d0 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57  Ready = sqlite3W
283e0 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53  hereCodeOneLoopS
283f0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
28400 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
28410 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
28420 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
28430 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77  Cont;.    if( (w
28440 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  sFlags&WHERE_MUL
28450 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63  TI_OR)==0 && (wc
28460 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
28470 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30  NETABLE_ONLY)==0
28480 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28490 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61  3WhereAddScanSta
284a0 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c  tus(v, pTabList,
284b0 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70   pLevel, addrExp
284c0 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lain);.    }.  }
284d0 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
284e0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
284f0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
28500 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
28510 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
28520 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
28530 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
28540 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
28550 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
28560 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
28570 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
28580 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
28590 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
285a0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
285b0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
285c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
285d0 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
285e0 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
285f0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
28600 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
28610 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
28620 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
28630 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
28640 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
28650 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
28660 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
28670 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
28680 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
28690 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
286a0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
286b0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
286c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
286d0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
286e0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
286f0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
28700 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
28710 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
28720 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
28730 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
28740 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
28750 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
28760 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
28770 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
28780 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
28790 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
287a0 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
287b0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
287c0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
287d0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
287e0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
287f0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
28800 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28810 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
28820 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
28830 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
28840 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
28850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28860 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p3(v, pLevel->op
28870 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
28880 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c  evel->p2, pLevel
28890 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p3);.      sql
288a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
288b0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
288c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
288d0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
288e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
288f0 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e  pLevel->op==OP_N
28900 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ext);.      Vdbe
28910 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
28920 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65  evel->op==OP_Pre
28930 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
28940 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
28950 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74  el->op==OP_VNext
28960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
28970 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
28980 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
28990 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
289a0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
289b0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
289c0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
289d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
289e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
289f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
28a00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
28a10 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
28a20 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
28a30 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
28a40 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
28a50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28a60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28a70 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
28a80 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
28a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28aa0 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
28ab0 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  p, pIn->iCur, pI
28ac0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
28ad0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
28ae0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
28af0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28b00 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
28b10 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  p==OP_PrevIfOpen
28b20 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
28b30 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
28b40 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
28b50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20  _NextIfOpen);.  
28b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28b70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
28b80 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
28b90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28bb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
28bc0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
28bd0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
28be0 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  ddrSkip ){.     
28bf0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
28c00 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
28c10 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62  Skip);.      Vdb
28c20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
28c30 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20  xt skip-scan on 
28c40 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  %s", pLoop->u.bt
28c50 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
28c60 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
28c70 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28c80 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
28c90 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ip);.      sqlit
28ca0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28cb0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
28cc0 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ip-2);.    }.   
28cd0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
28ce0 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20  rLikeRep ){.    
28cf0 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20    int op;.      
28d00 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  if( sqlite3VdbeG
28d10 65 74 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  etOp(v, pLevel->
28d20 61 64 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e  addrLikeRep-1)->
28d30 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  p1 ){.        op
28d40 20 3d 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65   = OP_DecrJumpZe
28d50 72 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ro;.      }else{
28d60 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
28d70 5f 4a 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20  _JumpZeroIncr;. 
28d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
28d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28da0 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  , op, pLevel->iL
28db0 69 6b 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76  ikeRepCntr, pLev
28dc0 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29  el->addrLikeRep)
28dd0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28de0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
28df0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
28e00 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
28e10 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
28e20 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28e30 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
28e40 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
28e50 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
28e60 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
28e70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28e80 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
28e90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
28ea0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
28eb0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
28ec0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
28ed0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
28ee0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
28ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
28f00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
28f10 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
28f20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
28f30 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
28f40 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
28f50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28f60 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
28f70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28f80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
28f90 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
28fa0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
28fb0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
28fc0 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
28fd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28fe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28ff0 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
29000 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
29010 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
29020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
29030 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
29040 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
29050 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
29060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
29070 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
29080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
29090 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
290a0 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
290b0 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290d0 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
290e0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
290f0 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
29100 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
29110 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
29120 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
29130 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
29140 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
29150 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
29160 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29170 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
29180 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
29190 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
291a0 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
291b0 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
291c0 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
291d0 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
291e0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
291f0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
29200 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
29210 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
29220 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
29230 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
29240 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
29250 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
29260 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
29270 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
29280 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
29290 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
292a0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
292b0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
292c0 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
292d0 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
292e0 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
292f0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
29300 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
29310 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
29320 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43  outine into OP_C
29330 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  opy of result co
29340 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67  ntained in a reg
29350 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50  ister..    ** OP
29360 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f  _Rowid becomes O
29370 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  P_Null..    */. 
29380 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
29390 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
293a0 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
293b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74  ailed ){.      t
293c0 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
293d0 43 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Copy(v, pLevel->
293e0 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c  addrBody, pLevel
293f0 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  ->iTabCur,.     
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d         pTabItem-
29420 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a  >regResult, 0);.
29430 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
29440 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c      }..    /* Cl
29450 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
29460 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
29470 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
29480 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
29490 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
294a0 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72  not close cursor
294b0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
294c0 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20  eused by the OR 
294d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
294e0 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f   ** (WHERE_OMIT_
294f0 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e  OPEN_CLOSE).  An
29500 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74  d do not close t
29510 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  he OP_OpenWrite 
29520 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63  cursors.    ** c
29530 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f  reated for the O
29540 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
29550 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
29560 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
29570 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
29580 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
29590 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
295a0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
295b0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
295c0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
295d0 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  OSE)==0.    ){. 
295e0 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c       int ws = pL
295f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
29600 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
29610 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
29620 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20 57  S_OFF && (ws & W
29630 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
29640 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
29650 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29660 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
29670 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
29680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29690 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
296a0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
296b0 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45   && (ws & (WHERE
296c0 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f  _IPK|WHERE_AUTO_
296d0 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20  INDEX))==0 .    
296e0 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49     && pLevel->iI
296f0 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61  dxCur!=pWInfo->a
29700 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20  iCurOnePass[1]. 
29710 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29730 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
29740 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
29750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
29760 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
29770 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
29780 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64  x, make VDBE cod
29790 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
297a0 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
297b0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
297c0 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72  ex instead of fr
297d0 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65  om the table whe
297e0 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e  re possible.  In
297f0 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20   some cases.    
29800 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** this optimiza
29810 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68  tion prevents th
29820 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65  e table from eve
29830 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68  r being read, wh
29840 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79  ich can.    ** y
29850 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61  ield a significa
29860 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  nt performance b
29870 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  oost..    ** .  
29880 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
29890 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
298a0 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
298b0 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
298c0 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
298d0 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
298e0 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
298f0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
29900 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
29910 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
29920 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
29930 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
29940 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
29950 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
29960 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
29970 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
29980 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
29990 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
299a0 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
299b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
299c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
299d0 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
299e0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a  RE_IDX_ONLY) ){.
299f0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
29a00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
29a10 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ex;.    }else if
29a20 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
29a30 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
29a40 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  R ){.      pIdx 
29a50 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  = pLevel->u.pCov
29a60 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  idx;.    }.    i
29a70 66 28 20 70 49 64 78 0a 20 20 20 20 20 26 26 20  f( pIdx.     && 
29a80 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73  (pWInfo->eOnePas
29a90 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c  s==ONEPASS_OFF |
29aa0 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78  | !HasRowid(pIdx
29ab0 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20  ->pTable)).     
29ac0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
29ad0 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20  iled.    ){.    
29ae0 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
29af0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
29b00 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c  v);.      k = pL
29b10 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a  evel->addrBody;.
29b20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
29b30 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
29b40 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  k);.      for(; 
29b50 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
29b60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
29b70 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
29b80 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
29b90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
29ba0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
29bb0 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
29bc0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f        int x = pO
29bd0 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20  p->p2;.         
29be0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
29bf0 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
29c00 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61           if( !Ha
29c10 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
29c20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
29c30 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
29c40 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
29c50 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
29c60 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f     x = pPk->aiCo
29c70 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20  lumn[x];.       
29c80 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
29c90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0 );.          }
29ca0 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
29cb0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
29cc0 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20  dex(pIdx, x);.  
29cd0 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30          if( x>=0
29ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29cf0 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20  pOp->p2 = x;.   
29d00 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
29d10 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
29d20 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ur;.          }.
29d30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29d40 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
29d50 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
29d60 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29  LY)==0 || x>=0 )
29d70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
29d80 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
29d90 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
29da0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
29db0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
29dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
29dd0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
29de0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
29df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29e00 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
29e10 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
29e20 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
29e30 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
29e40 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
29e50 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
29e60 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
29e70 6e 3b 0a 7d 0a                                   n;.}.