/ Hex Artifact Content
Login

Artifact edcaa18b274526a2a74519d5b38ca6845b24dfc2:


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 20 20 72 65 74 75 72 6e  nt)*2);.  return
0bf0: 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
0c00: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  s;.}../*.** Move
0c10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
0c20: 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a  pSrc into pDest.
0c30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
0c40: 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65  hereOrMove(Where
0c50: 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68  OrSet *pDest, Wh
0c60: 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b  ereOrSet *pSrc){
0c70: 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53  .  pDest->n = pS
0c80: 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  rc->n;.  memcpy(
0c90: 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e  pDest->a, pSrc->
0ca0: 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65  a, pDest->n*size
0cb0: 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29  of(pDest->a[0]))
0cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
0cd0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70  o insert a new p
0ce0: 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74  rerequisite/cost
0cf0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
0d00: 57 68 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e  WhereOrSet pSet.
0d10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65  .**.** The new e
0d20: 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77  ntry might overw
0d30: 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
0d40: 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69   entry, or it mi
0d50: 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64  ght be.** append
0d60: 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ed, or it might 
0d70: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 44  be discarded.  D
0d80: 6f 20 77 68 61 74 65 76 65 72 20 69 73 20 74 68  o whatever is th
0d90: 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a  e right thing.**
0da0: 20 73 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65   so that pSet ke
0db0: 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53  eps the N_OR_COS
0dc0: 54 20 62 65 73 74 20 65 6e 74 72 69 65 73 20 73  T best entries s
0dd0: 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73  een so far..*/.s
0de0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f  tatic int whereO
0df0: 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65  rInsert(.  Where
0e00: 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20  OrSet *pSet,    
0e10: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72    /* The WhereOr
0e20: 53 65 74 20 74 6f 20 62 65 20 75 70 64 61 74 65  Set to be update
0e30: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
0e40: 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a  rereq,        /*
0e50: 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   Prerequisites o
0e60: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
0e70: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e  */.  LogEst rRun
0e80: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
0e90: 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e  un-cost of the n
0ea0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f  ew entry */.  Lo
0eb0: 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20  gEst nOut       
0ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0ed0: 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68  f outputs for th
0ee0: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29  e new entry */.)
0ef0: 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65  {.  u16 i;.  Whe
0f00: 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66  reOrCost *p;.  f
0f10: 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d  or(i=pSet->n, p=
0f20: 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSet->a; i>0; i-
0f30: 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, p++){.    if(
0f40: 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26   rRun<=p->rRun &
0f50: 26 20 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70  & (prereq & p->p
0f60: 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29  rereq)==prereq )
0f70: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65  {.      goto whe
0f80: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b  reOrInsert_done;
0f90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
0fa0: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20  ->rRun<=rRun && 
0fb0: 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65  (p->prereq & pre
0fc0: 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
0fd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0fe0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
0ff0: 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f  f( pSet->n<N_OR_
1000: 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20  COST ){.    p = 
1010: 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e  &pSet->a[pSet->n
1020: 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74  ++];.    p->nOut
1030: 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65   = nOut;.  }else
1040: 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e  {.    p = pSet->
1050: 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  a;.    for(i=1; 
1060: 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pSet->n; i++){
1070: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52  .      if( p->rR
1080: 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52  un>pSet->a[i].rR
1090: 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61  un ) p = pSet->a
10a0: 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + i;.    }.    
10b0: 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75  if( p->rRun<=rRu
10c0: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
10d0: 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f  }.whereOrInsert_
10e0: 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65  done:.  p->prere
10f0: 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d  q = prereq;.  p-
1100: 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20  >rRun = rRun;.  
1110: 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  if( p->nOut>nOut
1120: 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75   ) p->nOut = nOu
1130: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
1140: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1150: 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
1160: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
1170: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
1180: 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20  0 if.** iCursor 
1190: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65  is not in the se
11a0: 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71  t..*/.Bitmask sq
11b0: 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
11c0: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
11d0: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
11e0: 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b  ursor){.  int i;
11f0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
1200: 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a  Set->n<=(int)siz
1210: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
1220: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1230: 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29  MaskSet->n; i++)
1240: 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53  {.    if( pMaskS
1250: 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73  et->ix[i]==iCurs
1260: 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  or ){.      retu
1270: 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  rn MASKBIT(i);. 
1280: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1290: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
12a0: 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20  eate a new mask 
12b0: 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73  for cursor iCurs
12c0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  or..**.** There 
12d0: 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65  is one cursor pe
12e0: 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  r table in the F
12f0: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1300: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61   number of.** ta
1310: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
1320: 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
1330: 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72  ed by a test ear
1340: 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ly in the.** sql
1350: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1360: 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65   routine.  So we
1370: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70   know that the p
1380: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a  MaskSet->ix[].**
1390: 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65   array will neve
13a0: 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73  r overflow..*/.s
13b0: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
13c0: 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53  eMask(WhereMaskS
13d0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e  et *pMaskSet, in
13e0: 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73  t iCursor){.  as
13f0: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
1400: 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d  n < ArraySize(pM
1410: 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20  askSet->ix) );. 
1420: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d   pMaskSet->ix[pM
1430: 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69  askSet->n++] = i
1440: 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cursor;.}../*.**
1450: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
1460: 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74  next WhereTerm t
1470: 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f  hat matches acco
1480: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69  rding to the cri
1490: 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69  teria.** establi
14a0: 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53  shed when the pS
14b0: 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69  can object was i
14c0: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68  nitialized by wh
14d0: 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a  ereScanInit()..*
14e0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
14f0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1500: 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72  re matching Wher
1510: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69  eTerms..*/.stati
1520: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
1530: 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65  reScanNext(Where
1540: 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20  Scan *pScan){.  
1550: 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1560: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1570: 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  or on the LHS of
1580: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
1590: 31 36 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  16 iColumn;     
15a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
15b0: 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  n on the LHS of 
15c0: 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f  the term.  -1 fo
15d0: 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20  r IPK */.  Expr 
15e0: 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
15f0: 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
1600: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1610: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1620: 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74  pWC;    /* Short
1630: 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e  hand for pScan->
1640: 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  pWC */.  WhereTe
1650: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  rm *pTerm;    /*
1660: 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   The term being 
1670: 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
1680: 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20  k = pScan->k;   
1690: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61   /* Where to sta
16a0: 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a  rt scanning */..
16b0: 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e    while( pScan->
16c0: 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e  iEquiv<=pScan->n
16d0: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75  Equiv ){.    iCu
16e0: 72 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72  r = pScan->aiCur
16f0: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
1700: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
1710: 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e   pScan->aiColumn
1720: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
1730: 5d 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  ];.    if( iColu
1740: 6d 6e 3d 3d 28 2d 32 29 20 26 26 20 70 53 63 61  mn==(-2) && pSca
1750: 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29  n->pIdxExpr==0 )
1760: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
1770: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
1780: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
1790: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
17a0: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
17b0: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
17c0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
17d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
17e0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
17f0: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
1800: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
1810: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
1820: 69 43 6f 6c 75 6d 6e 21 3d 28 2d 32 29 0a 20 20  iColumn!=(-2).  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1840: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1850: 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  re(pTerm->pExpr-
1860: 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70 49  >pLeft,pScan->pI
1870: 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29  dxExpr,iCur)==0)
1880: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
1890: 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c  can->iEquiv<=1 |
18a0: 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
18b0: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
18c0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
18d0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
18e0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
18f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
1900: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
1910: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
1920: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
1930: 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20  Scan->aiCur).   
1940: 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d          && (pX =
1950: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1960: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
1970: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
1980: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
1990: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
19a0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
19b0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
19c0: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
19d0: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
19e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
19f0: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
1a00: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
1a10: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
1a20: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
1a30: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1a80: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
1a90: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
1aa0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
1ab0: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
1ac0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
1ad0: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
1ae0: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
1af0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
1b00: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
1b10: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
1b20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b30: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1b40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
1b50: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
1b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b70: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
1b80: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
1b90: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
1ba0: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
1bb0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
1bc0: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
1bd0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1be0: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
1c00: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
1c20: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
1c30: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
1c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1c50: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
1c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c70: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
1c80: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
1c90: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
1ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cb0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1cc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cd0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1ce0: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
1cf0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
1d00: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
1d10: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1d20: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
1d60: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
1d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d80: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
1d90: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1da0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1dc0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1dd0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
1de0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
1df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e30: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1e40: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1e50: 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  _EQ|WO_IS))!=0. 
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1e70: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1e80: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
1e90: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1ea0: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
1eb0: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  able==pScan->aiC
1ec0: 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  ur[0].          
1ed0: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
1ee0: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75  n==pScan->aiColu
1ef0: 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  mn[0].          
1f00: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1f10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1f20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1f30: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
1f40: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f60: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
1f70: 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20  ->k = k+1;.     
1f80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
1f90: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  erm;.          }
1fa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fb0: 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e   }.      pScan->
1fc0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
1fd0: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
1fe0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  k = 0;.    }.   
1ff0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
2000: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20  can->pOrigWC;.  
2010: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63    k = 0;.    pSc
2020: 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20  an->iEquiv++;.  
2030: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2040: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2050: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
2060: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
2070: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
2080: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
2090: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
20a0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
20b0: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
20c0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
20d0: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
20e0: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
20f0: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
2100: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
2110: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2120: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2130: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
2140: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
2150: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
2160: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
2170: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
2180: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
2190: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
21a0: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
21b0: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
21c0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
21d0: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
21e0: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
21f0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
2200: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
2210: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2220: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
2230: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
2240: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
2250: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
2260: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
2270: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
2280: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
2290: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
22a0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
22b0: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
22c0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
22d0: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
22e0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
22f0: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
2300: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
2310: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
2320: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
2330: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
2340: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
2350: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
2360: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2370: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2380: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
2390: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
23a0: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
23b0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
23c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
23d0: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
23e0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
23f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2400: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
2410: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
2420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2430: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
2440: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
2450: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2460: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
2470: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
2480: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
2490: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 0a  {.  int j = 0;..
24a0: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
24b0: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
24c0: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
24d0: 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43  n->pOrigWC = pWC
24e0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  ;.  pScan->pWC =
24f0: 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70   pWC;.  pScan->p
2500: 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20 69  IdxExpr = 0;.  i
2510: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 6a  f( pIdx ){.    j
2520: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = iColumn;.    
2530: 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  iColumn = pIdx->
2540: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2550: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 28 2d   if( iColumn==(-
2560: 32 29 20 29 20 70 53 63 61 6e 2d 3e 70 49 64 78  2) ) pScan->pIdx
2570: 45 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43 6f  Expr = pIdx->aCo
2580: 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70  lExpr->a[j].pExp
2590: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  r;.  }.  if( pId
25a0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
25b0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
25c0: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
25d0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
25e0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
25f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2600: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2610: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2620: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2630: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2640: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2650: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
2660: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
2670: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
2680: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
2690: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
26a0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
26b0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
26c0: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
26d0: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
26e0: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
26f0: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2700: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2710: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2720: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2730: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2740: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2750: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2760: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2770: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2780: 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f  able iCur and <o
2790: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20  p> is one of.** 
27a0: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
27b0: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
27c0: 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72  ed by the op par
27d0: 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72  ameter..** Retur
27e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
27f0: 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  he term.  Return
2800: 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e   0 if not found.
2810: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d  .**.** If pIdx!=
2820: 30 20 74 68 65 6e 20 73 65 61 72 63 68 20 66 6f  0 then search fo
2830: 72 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  r terms matching
2840: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2850: 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a  column of pIdx.*
2860: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
2870: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
2880: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
2890: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  r..**.** The ter
28a0: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
28b0: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
28c0: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
28d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
28e0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
28f0: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
2900: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
2910: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
2920: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
2930: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
2940: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
2950: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
2960: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
2970: 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c  ** aiCur[]/iaCol
2980: 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c  umn[] arrays hol
2990: 64 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  d X and all its 
29a0: 65 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65  equivalents. The
29b0: 72 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f  re are 11.** slo
29c0: 74 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69  ts in aiCur[]/ai
29d0: 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74  Column[] so that
29e0: 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f   means we can lo
29f0: 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70  ok for X plus up
2a00: 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20   to 10.** other 
2a10: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
2a20: 73 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72  s.  Hence a sear
2a30: 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65  ch for X will re
2a40: 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58  turn <expr> if X
2a50: 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32  =A1.** and A1=A2
2a60: 20 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e   and A2=A3 and .
2a70: 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e  .. and A9=A10 an
2a80: 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a  d A10=<expr>..**
2a90: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
2aa0: 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
2ab0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2ac0: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
2ad0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
2ae0: 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20  ** then try for 
2af0: 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20  the one with no 
2b00: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
2b10: 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65  <expr> - in othe
2b20: 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a  r words where.**
2b30: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e   <expr> is a con
2b40: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
2b50: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
2b60: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72  Only return entr
2b70: 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  ies of.** the fo
2b80: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
2b90: 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d  ere Y is a colum
2ba0: 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62  n in another tab
2bb0: 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f  le if no terms o
2bc0: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
2bd0: 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70   <op> <const-exp
2be0: 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20  r>" exist.   If 
2bf0: 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20  no terms with a 
2c00: 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20  constant RHS.** 
2c10: 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65  exist, try to re
2c20: 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74  turn a term that
2c30: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f   does not use WO
2c40: 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65  _EQUIV..*/.Where
2c50: 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65  Term *sqlite3Whe
2c60: 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68  reFindTerm(.  Wh
2c70: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2c80: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2c90: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
2ca0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
2cb0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
2cc0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2cd0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
2ce0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
2cf0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
2d00: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
2d10: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
2d20: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
2d30: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
2d40: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
2d50: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
2d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
2d70: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
2d80: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
2d90: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
2da0: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
2db0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
2dc0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
2dd0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
2de0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
2df0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
2e00: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
2e10: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
2e20: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
2e30: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
2e40: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
2e50: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
2e60: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57  .  op &= WO_EQ|W
2e70: 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70  O_IS;.  while( p
2e80: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
2e90: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
2ea0: 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
2eb0: 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65      if( p->prere
2ec0: 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d  qRight==0 && (p-
2ed0: 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d  >eOperator&op)!=
2ee0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
2ef0: 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61  tcase( p->eOpera
2f00: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
2f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b         return p;
2f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f30: 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( pResult==0 ) 
2f40: 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20  pResult = p;.   
2f50: 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65   }.    p = where
2f60: 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b  ScanNext(&scan);
2f70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
2f80: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  esult;.}../*.** 
2f90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
2fa0: 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
2fb0: 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d   an entry that m
2fc0: 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d  atches the iCol-
2fd0: 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  th column.** of 
2fe0: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
2ff0: 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70  * If such an exp
3000: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
3010: 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70  , its index in p
3020: 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74  List->a[] is ret
3030: 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20  urned. If.** no 
3040: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3050: 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  und, -1 is retur
3060: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
3070: 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28  nt findIndexCol(
3080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
30b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
30c0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
30d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
30e0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73  ession list to s
30f0: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
3100: 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  Base,           
3110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3120: 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61  rsor for table a
3130: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
3140: 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
3150: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
3160: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
3170: 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d  x to match colum
3180: 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43  n of */.  int iC
3190: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
31a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
31b0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20  umn of index to 
31c0: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
31d0: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
31e0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
31f0: 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a  >azColl[iCol];..
3200: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
3210: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
3220: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3230: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3240: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
3250: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
3260: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
3270: 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  MN.     && p->iC
3280: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
3290: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20  olumn[iCol].    
32a0: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
32b0: 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Base.    ){.    
32c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
32d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
32e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
32f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
3300: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  ;.      if( pCol
3310: 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  l && 0==sqlite3S
3320: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
3330: 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ame, zColl) ){. 
3340: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b         return i;
3350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3360: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   }..  return -1;
3370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3380: 20 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f   TRUE if the iCo
3390: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  l-th column of i
33a0: 6e 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54  ndex pIdx is NOT
33b0: 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20   NULL.*/.static 
33c0: 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e  int indexColumnN
33d0: 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49  otNull(Index *pI
33e0: 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  dx, int iCol){. 
33f0: 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74   int j;.  assert
3400: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61  ( pIdx!=0 );.  a
3410: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
3420: 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f  & iCol<pIdx->nCo
3430: 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49  lumn );.  j = pI
3440: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
3450: 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29  l];.  if( j>=0 )
3460: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64  {.    return pId
3470: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
3480: 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65  j].notNull;.  }e
3490: 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20  lse if( j==(-1) 
34a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
34b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
34c0: 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b  sert( j==(-2) );
34d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
34e0: 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64  /* Assume an ind
34f0: 65 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  exed expression 
3500: 63 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64  can always yield
3510: 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a   a NULL */..  }.
3520: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3530: 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
3540: 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
3550: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
3560: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
3570: 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
3580: 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
3590: 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
35a0: 6e 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62  ndant if any sub
35b0: 73 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  set of the colum
35c0: 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53  ns in the.** DIS
35d0: 54 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63  TINCT list are c
35e0: 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71  ollectively uniq
35f0: 75 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61  ue and individua
3600: 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f  lly non-null..*/
3610: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69  .static int isDi
3620: 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
3630: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3650: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3660: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
3670: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  abList,        /
3680: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
3690: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
36a0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
36b0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
36c0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
36d0: 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20  st *pDistinct   
36e0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
36f0: 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73  t set that needs
3700: 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20   to be DISTINCT 
3710: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
3720: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
3730: 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  dx;.  int i;    
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61        .  int iBa
3760: 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  se;..  /* If the
3770: 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  re is more than 
3780: 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  one table or sub
3790: 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46  -select in the F
37a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20  ROM clause of.  
37b0: 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ** this query, t
37c0: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  hen it will not 
37d0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73  be possible to s
37e0: 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53  how that the DIS
37f0: 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75  TINCT .  ** clau
3800: 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  se is redundant.
3810: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
3820: 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  st->nSrc!=1 ) re
3830: 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20  turn 0;.  iBase 
3840: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3850: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62  .iCursor;.  pTab
3860: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
3870: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
3880: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
3890: 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50  essions is an IP
38a0: 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c  K column on tabl
38b0: 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65  e iBase, then re
38c0: 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e  turn .  ** true.
38d0: 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69   Note: The (p->i
38e0: 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61  Table==iBase) pa
38f0: 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  rt of this test 
3900: 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20  may be false if 
3910: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
3920: 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72   SELECT is a cor
3930: 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
3940: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
3950: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
3960: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
3970: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3980: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
3990: 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69  e(pDistinct->a[i
39a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
39b0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
39c0: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
39d0: 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  =iBase && p->iCo
39e0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
39f0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  1;.  }..  /* Loo
3a00: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e  p through all in
3a10: 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
3a20: 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63  le, checking eac
3a30: 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d  h to see if it m
3a40: 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49  akes.  ** the DI
3a50: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
3a60: 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64   redundant. It d
3a70: 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a  oes so if:.  **.
3a80: 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e    **   1. The in
3a90: 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e  dex is itself UN
3aa0: 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  IQUE, and.  **. 
3ab0: 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20   **   2. All of 
3ac0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
3ad0: 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74  he index are eit
3ae0: 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  her part of the 
3af0: 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20  pDistinct.  **  
3b00: 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73      list, or els
3b10: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
3b20: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65  se contains a te
3b30: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
3b40: 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20  col=X",.  **    
3b50: 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63    where X is a c
3b60: 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54  onstant value. T
3b70: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
3b80: 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20  uences of the.  
3b90: 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73  **      comparis
3ba0: 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69  on and select-li
3bb0: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  st expressions m
3bc0: 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20  ust match those 
3bd0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
3be0: 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c  **.  **   3. All
3bf0: 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20   of those index 
3c00: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
3c10: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
3c20: 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  se does not.  **
3c30: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20        contain a 
3c40: 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65  "col=X" term are
3c50: 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f   subject to a NO
3c60: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
3c70: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  t..  */.  for(pI
3c80: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
3c90: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
3ca0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
3cb0: 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  ( !IsUniqueIndex
3cc0: 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
3cd0: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
3ce0: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
3cf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3d00: 20 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65   0==sqlite3Where
3d10: 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42  FindTerm(pWC, iB
3d20: 61 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73  ase, i, ~(Bitmas
3d30: 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
3d40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
3d50: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
3d60: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
3d70: 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
3d80: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
3d90: 20 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c      if( indexCol
3da0: 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c  umnNotNull(pIdx,
3db0: 20 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   i)==0 ) break;.
3dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3dd0: 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e    if( i==pIdx->n
3de0: 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
3df0: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d  /* This index im
3e00: 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44  plies that the D
3e10: 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
3e20: 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  r is redundant. 
3e30: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
3e40: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
3e50: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
3e60: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
3e70: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
3e80: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f  e input value to
3e90: 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74   base 2..*/.stat
3ea0: 69 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67  ic LogEst estLog
3eb0: 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65  (LogEst N){.  re
3ec0: 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a  turn N<=10 ? 0 :
3ed0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e   sqlite3LogEst(N
3ee0: 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ) - 33;.}../*.**
3ef0: 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75   Convert OP_Colu
3f00: 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50  mn opcodes to OP
3f10: 5f 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75  _Copy in previou
3f20: 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f  sly generated co
3f30: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  de..**.** This r
3f40: 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72  outine runs over
3f50: 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20   generated VDBE 
3f60: 63 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61  code and transla
3f70: 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a  tes OP_Column.**
3f80: 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50   opcodes into OP
3f90: 5f 43 6f 70 79 2c 20 61 6e 64 20 4f 50 5f 52 6f  _Copy, and OP_Ro
3fa0: 77 69 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c  wid into OP_Null
3fb0: 2c 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  , when the table
3fc0: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 61 63 63   is being.** acc
3fd0: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
3fe0: 74 69 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20  tine instead of 
3ff0: 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  via table lookup
4000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4010: 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e   translateColumn
4020: 54 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a  ToCopy(.  Vdbe *
4030: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
4040: 20 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69   The VDBE contai
4050: 6e 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61  ning code to tra
4060: 6e 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  nslate */.  int 
4070: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
4080: 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  /* Translate fro
4090: 6d 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f  m this opcode to
40a0: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e   the end */.  in
40b0: 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20  t iTabCur,      
40c0: 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f    /* OP_Column/O
40d0: 50 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63  P_Rowid referenc
40e0: 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
40f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73   */.  int iRegis
4100: 74 65 72 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ter       /* The
4110: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73   first column is
4120: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
4130: 72 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70  r */.){.  VdbeOp
4140: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
4150: 64 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61  dbeGetOp(v, iSta
4160: 72 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  rt);.  int iEnd 
4170: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
4180: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66  rentAddr(v);.  f
4190: 6f 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64  or(; iStart<iEnd
41a0: 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b  ; iStart++, pOp+
41b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  +){.    if( pOp-
41c0: 3e 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63  >p1!=iTabCur ) c
41d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
41e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
41f0: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
4200: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
4210: 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f  P_Copy;.      pO
4220: 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20  p->p1 = pOp->p2 
4230: 2b 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20  + iRegister;.   
4240: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70     pOp->p2 = pOp
4250: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ->p3;.      pOp-
4260: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  >p3 = 0;.    }el
4270: 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
4280: 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
4290: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
42a0: 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20  e = OP_Null;.   
42b0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a     pOp->p1 = 0;.
42c0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20        pOp->p3 = 
42d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
42e0: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
42f0: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
4300: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
4310: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
4320: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
4330: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
4340: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
4350: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
4360: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
4370: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
4380: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
4390: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
43a0: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
43b0: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
43c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
43d0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
43e0: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
43f0: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
4400: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
4410: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
4420: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4430: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4440: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4450: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4460: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4470: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
4480: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4490: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
44a0: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
44b0: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
44c0: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
44d0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
44e0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
44f0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
4500: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4510: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
4520: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
4530: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
4540: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4550: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
4560: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4570: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
4580: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
4590: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
45a0: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
45b0: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
45c0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
45d0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
45e0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
45f0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
4600: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
4610: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4620: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
4630: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4640: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4650: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4660: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4670: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4680: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
4690: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
46a0: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
46b0: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
46c0: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
46d0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
46e0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
46f0: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
4700: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4710: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
4720: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
4730: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4740: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
4750: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
4760: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4770: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
4780: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
4790: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
47a0: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
47b0: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
47c0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
47d0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
47e0: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
47f0: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
4800: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
4810: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4820: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4830: 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20  edRows=%lld\n", 
4840: 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  p->estimatedRows
4850: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
4860: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
4870: 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
4880: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
4890: 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
48a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
48b0: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
48c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
48d0: 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
48e0: 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
48f0: 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
4900: 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
4910: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
4920: 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
4930: 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
4940: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
4950: 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
4960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4970: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
4980: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
4990: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
49a0: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
49b0: 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
49c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
49d0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
49e0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
49f0: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
4a00: 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
4a10: 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
4a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
4a30: 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
4a40: 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
4a50: 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
4a60: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
4a70: 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
4a80: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
4a90: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4aa0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
4ab0: 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  _EQ|WO_IS))==0 )
4ac0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4ad0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
4ae0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4af0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
4b00: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
4b10: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
4b20: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
4b30: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
4b40: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
4b50: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
4b60: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
4b70: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
4b80: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
4b90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
4ba0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
4bb0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4bc0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
4bd0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
4be0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4bf0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4c00: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4c10: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
4c20: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
4c30: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
4c40: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
4c50: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
4c60: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
4c70: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
4c80: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
4c90: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
4ca0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
4cb0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
4cc0: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
4cd0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
4ce0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4d00: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
4d10: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
4d20: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
4d30: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
4d40: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
4d50: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
4d60: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
4d70: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
4d80: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
4d90: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
4da0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
4db0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4dc0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
4dd0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
4de0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
4df0: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
4e00: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
4e10: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
4e20: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4e50: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
4e60: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
4e70: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
4e80: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
4e90: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
4ea0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4eb0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
4ec0: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
4ed0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
4ee0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
4ef0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
4f00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
4f10: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
4f20: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
4f30: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
4f60: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
4f70: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
4f80: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4fa0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
4fb0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
4fc0: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
4fd0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
4fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4ff0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
5000: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5010: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
5020: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5030: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5040: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5050: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5060: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5070: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5080: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
5090: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
50a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
50b0: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
50c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
50e0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
50f0: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5110: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5120: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5130: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5140: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5150: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5160: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5170: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5180: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
5190: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
51a0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
51b0: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
51d0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
51e0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
51f0: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5200: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5210: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5220: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5230: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5240: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5250: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5260: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5270: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5280: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
5290: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
52a0: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
52b0: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
52c0: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
52d0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
52e0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
52f0: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5300: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5310: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5320: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5330: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5340: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5350: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5360: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5370: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5380: 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47  dexed */..  /* G
5390: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
53a0: 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
53b0: 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
53c0: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
53d0: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
53e0: 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
53f0: 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
5400: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
5410: 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
5420: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
5430: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
5440: 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74  addrInit = sqlit
5450: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
5460: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5470: 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  (v);..  /* Count
5480: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
5490: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
54a0: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
54b0: 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20   index.  ** and 
54c0: 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48  used to match WH
54d0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
54e0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79  raints */.  nKey
54f0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
5500: 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
5510: 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
5520: 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
5530: 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
5540: 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43  ->pWLoop;.  idxC
5550: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
5560: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
5570: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
5580: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
5590: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
55a0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
55b0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
55c0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
55d0: 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65 72  Join)    /* prer
55e0: 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65  eq always non-ze
55f0: 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c  ro */.         |
5600: 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  | pExpr->iRightJ
5610: 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  oinTable!=pSrc->
5620: 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20 66  iCursor   /*   f
5630: 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  or the right-han
5640: 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  d   */.         
5650: 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71  || pLoop->prereq
5660: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
5670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
5680: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
5690: 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  JOIN */.    if( 
56a0: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30  pLoop->prereq==0
56b0: 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
56c0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
56d0: 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20  VIRTUAL)==0.    
56e0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
56f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
5700: 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26  romJoin).     &&
5710: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
5720: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  bleConstant(pExp
5730: 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r, pSrc->iCursor
5740: 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 74  ) ){.      pPart
5750: 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ial = sqlite3Exp
5760: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
5770: 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20 20 20   pPartial,.     
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
57a0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
57b0: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 29  ->db, pExpr, 0))
57c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
57d0: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
57e0: 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
57f0: 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
5800: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
5810: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5820: 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
5830: 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
5840: 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
5850: 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
5860: 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
5870: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
5880: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5890: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
58a0: 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74 57        if( !sentW
58b0: 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  arning ){.      
58c0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
58d0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
58e0: 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20  OINDEX,.        
58f0: 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69      "automatic i
5900: 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c  ndex on %s(%s)",
5910: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
5920: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
5930: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  le->aCol[iCol].z
5940: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Name);.        s
5950: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a  entWarning = 1;.
5960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5970: 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
5980: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
5990: 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
59a0: 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
59b0: 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c  , pLoop, nKeyCol
59c0: 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1) ){.         
59d0: 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69   goto end_auto_i
59e0: 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 20  ndex_create;.   
59f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
5a00: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65  Loop->aLTerm[nKe
5a10: 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  yCol++] = pTerm;
5a20: 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
5a30: 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
5a40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
5a50: 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30  ssert( nKeyCol>0
5a60: 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   );.  pLoop->u.b
5a70: 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70  tree.nEq = pLoop
5a80: 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43  ->nLTerm = nKeyC
5a90: 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ol;.  pLoop->wsF
5aa0: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
5ab0: 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
5ac0: 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
5ad0: 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20  INDEXED.        
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
5af0: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
5b00: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
5b10: 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74   number of addit
5b20: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
5b30: 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  eded to create a
5b40: 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69  .  ** covering i
5b50: 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69  ndex.  A "coveri
5b60: 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20  ng index" is an 
5b70: 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
5b80: 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c  ins all.  ** col
5b90: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65  umns that are ne
5ba0: 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72  eded by the quer
5bb0: 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72  y.  With a cover
5bc0: 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20  ing index, the. 
5bd0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
5be0: 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  le never needs t
5bf0: 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20  o be accessed.  
5c00: 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65  Automatic indice
5c10: 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  s must.  ** be a
5c20: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
5c30: 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65  because the inde
5c40: 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  x will not be up
5c50: 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a  dated if the.  *
5c60: 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
5c70: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65   changes and the
5c80: 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
5c90: 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
5ca0: 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65  used.  ** if the
5cb0: 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63  y go out of sync
5cc0: 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f  ..  */.  extraCo
5cd0: 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73  ls = pSrc->colUs
5ce0: 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c  ed & (~idxCols |
5cf0: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29   MASKBIT(BMS-1))
5d00: 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d  ;.  mxBitCol = M
5d10: 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d  IN(BMS-1,pTable-
5d20: 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61  >nCol);.  testca
5d30: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
5d40: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73  ==BMS-1 );.  tes
5d50: 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
5d60: 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  Col==BMS-2 );.  
5d70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
5d80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
5d90: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
5da0: 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65 79  ASKBIT(i) ) nKey
5db0: 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Col++;.  }.  if(
5dc0: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
5dd0: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
5de0: 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b  ){.    nKeyCol +
5df0: 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d  = pTable->nCol -
5e00: 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20   BMS + 1;.  }.. 
5e10: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
5e20: 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  e Index object t
5e30: 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  o describe this 
5e40: 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20  index */.  pIdx 
5e50: 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
5e60: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61  eIndexObject(pPa
5e70: 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c  rse->db, nKeyCol
5e80: 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64  +1, 0, &zNotUsed
5e90: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
5ea0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f   ) goto end_auto
5eb0: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
5ec0: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
5ed0: 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
5ee0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22   pIdx->zName = "
5ef0: 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70  auto-index";.  p
5f00: 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
5f10: 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
5f20: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
5f30: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5f40: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
5f50: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
5f60: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
5f70: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
5f80: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
5f90: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5fa0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
5fb0: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
5fc0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
5fd0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
5fe0: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
5ff0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
6000: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
6010: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
6020: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
6030: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
6040: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
6050: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
6060: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
6070: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78  xpr;.        idx
6080: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6090: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
60a0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d  olumn[n] = pTerm
60b0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
60c0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
60d0: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
60e0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
60f0: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
6100: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
6110: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
6120: 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  [n] = pColl ? pC
6130: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49  oll->zName : "BI
6140: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e  NARY";.        n
6150: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
6160: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6170: 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
6180: 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
6190: 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
61a0: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
61b0: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
61c0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
61d0: 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
61e0: 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
61f0: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
6200: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
6210: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
6220: 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
6230: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6240: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6250: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6260: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
6270: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
6280: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6290: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
62a0: 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
62b0: 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
62c0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
62d0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
62e0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
62f0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6300: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
6310: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
6320: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
6330: 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
6340: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6350: 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  -1;.  pIdx->azCo
6360: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
6370: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
6380: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6390: 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ex */.  assert( 
63a0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
63b0: 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  =0 );.  pLevel->
63c0: 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
63d0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
63e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
63f0: 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
6400: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
6410: 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a  ur, nKeyCol+1);.
6420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6430: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
6440: 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43  , pIdx);.  VdbeC
6450: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
6460: 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
6470: 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
6480: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
6490: 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
64a0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  t */.  sqlite3Ex
64b0: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
64c0: 73 65 29 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  se);.  pTabItem 
64d0: 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e  = &pWC->pWInfo->
64e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
64f0: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66  el->iFrom];.  if
6500: 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76  ( pTabItem->fg.v
6510: 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  iaCoroutine ){. 
6520: 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20     int regYield 
6530: 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52  = pTabItem->regR
6540: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
6550: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6560: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
6570: 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70  , regYield, 0, p
6580: 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  TabItem->addrFil
6590: 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64 72 54  lSub);.    addrT
65a0: 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  op =  sqlite3Vdb
65b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
65c0: 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  eld, regYield);.
65d0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
65e0: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
65f0: 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72  ment((v, "next r
6600: 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70  ow of \"%s\"", p
6610: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
6620: 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Name));.  }else{
6630: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
6640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6650: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
6660: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
6670: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6680: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
6690: 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e  tial ){.    iCon
66a0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
66b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
66c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
66d0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
66e0: 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69  pPartial, iConti
66f0: 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  nue, SQLITE_JUMP
6700: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f  IFNULL);.    pLo
6710: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
6720: 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 3b  HERE_PARTIALIDX;
6730: 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72 64  .  }.  regRecord
6740: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6750: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
6760: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
6770: 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
6780: 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
6790: 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
67a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
67b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67c0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
67d0: 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt, pLevel->iIdx
67e0: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Cur, regRecord);
67f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6800: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6810: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
6820: 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
6830: 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
6840: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
6850: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
6860: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
6870: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6880: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
6890: 6f 43 6f 70 79 28 76 2c 20 61 64 64 72 54 6f 70  oCopy(v, addrTop
68a0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
68b0: 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67  r, pTabItem->reg
68c0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 73 71 6c  Result);.    sql
68d0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
68e0: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54  addrTop);.    pT
68f0: 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
6900: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d  routine = 0;.  }
6910: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6920: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6930: 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
6940: 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
6950: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
6960: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
6970: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6980: 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  v, SQLITE_STMTST
6990: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b  ATUS_AUTOINDEX);
69a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
69b0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
69c0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  p);.  sqlite3Rel
69d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
69e0: 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
69f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6a00: 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
6a10: 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
6a20: 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
6a30: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
6a40: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
6a50: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
6a60: 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75  drInit);..end_au
6a70: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a  to_index_create:
6a80: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
6a90: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
6aa0: 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65   pPartial);.}.#e
6ab0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6ac0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
6ad0: 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  DEX */..#ifndef 
6ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6af0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
6b00: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
6b10: 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  late an sqlite3_
6b20: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
6b30: 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20  ture. It is the 
6b40: 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
6b50: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
6b60: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
6b70: 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63  elease the struc
6b80: 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69  ture.** by passi
6b90: 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72  ng the pointer r
6ba0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6bb0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69  function to sqli
6bc0: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
6bd0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
6be0: 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61  dex_info *alloca
6bf0: 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50  teIndexInfo(.  P
6c00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
6c10: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
6c20: 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75  ,.  Bitmask mUnu
6c30: 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  sable,          
6c40: 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65      /* Ignore te
6c50: 72 6d 73 20 77 69 74 68 20 74 68 65 73 65 20 70  rms with these p
6c60: 72 65 72 65 71 73 20 2a 2f 0a 20 20 73 74 72 75  rereqs */.  stru
6c70: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
6c80: 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
6c90: 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
6ca0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
6cb0: 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
6cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
6cd0: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
6ce0: 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
6cf0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
6d00: 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
6d10: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
6d20: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
6d30: 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
6d40: 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
6d50: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
6d60: 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
6d70: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
6d80: 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75  xInfo;..  /* Cou
6d90: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
6da0: 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
6db0: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
6dc0: 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
6dd0: 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
6de0: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
6df0: 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
6e00: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
6e10: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
6e20: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
6e30: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
6e40: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
6e50: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
6e60: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
6e70: 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73  reqRight & mUnus
6e80: 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  able ) continue;
6e90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50  .    assert( IsP
6ea0: 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d  owerOfTwo(pTerm-
6eb0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f  >eOperator & ~WO
6ec0: 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74  _EQUIV) );.    t
6ed0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
6ee0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
6ef0: 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  N );.    testcas
6f00: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
6f10: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
6f20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
6f30: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
6f40: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
6f50: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
6f60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6f70: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
6f80: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
6f90: 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
6fa0: 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29  WO_EQUIV|WO_IS))
6fb0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
6fc0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
6fd0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
6fe0: 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
6ff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
7000: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e  m->u.leftColumn>
7010: 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65  =(-1) );.    nTe
7020: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
7030: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
7040: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
7050: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
7060: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
7070: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
7080: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
7090: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
70a0: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
70b0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
70c0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
70d0: 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
70e0: 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
70f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
7100: 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
7110: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
7120: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
7130: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7140: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
7150: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
7160: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
7170: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
7180: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
7190: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
71a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
71b0: 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
71c0: 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
71d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
71e0: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
71f0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7200: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
7210: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
7220: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
7230: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
7240: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
7270: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
7280: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
7290: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
72b0: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
72c0: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
72d0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
72e0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
72f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7300: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
7310: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7320: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
7330: 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
7340: 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
7350: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
7360: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
7370: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
7380: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
7390: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
73a0: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
73b0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
73c0: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
73d0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
73e0: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
73f0: 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
7400: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
7410: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
7420: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
7430: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7440: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
7450: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
7460: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
7470: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
7480: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
7490: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
74a0: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
74b0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
74c0: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
74d0: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
74e0: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
74f0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
7500: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
7510: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
7520: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
7530: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
7540: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
7550: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
7560: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
7570: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
7580: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
7590: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
75a0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
75b0: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
75c0: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
75d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
75e0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
75f0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
7600: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
7660: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
7670: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
7680: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
7690: 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
76a0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
76b0: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
76c0: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
76d0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
76e0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
76f0: 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f  & mUnusable ) co
7700: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
7710: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
7720: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
7730: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
7740: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7750: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7760: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
7770: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7780: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7790: 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IS );.    testca
77a0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
77b0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
77c0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
77d0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
77e0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
77f0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
7800: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
7810: 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c  ISNULL|WO_EQUIV|
7820: 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e  WO_IS))==0 ) con
7830: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
7840: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7850: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
7860: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
7870: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
7880: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
7890: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
78a0: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
78b0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
78c0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
78d0: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
78e0: 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65      op = (u8)pTe
78f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7900: 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  WO_ALL;.    if( 
7910: 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d  op==WO_IN ) op =
7920: 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78   WO_EQ;.    pIdx
7930: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b  Cons[j].op = op;
7940: 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
7950: 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
7960: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
7970: 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
7980: 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
7990: 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
79a0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
79b0: 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
79c0: 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
79d0: 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
79e0: 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
79f0: 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
7a00: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
7a10: 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
7a20: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
7a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7a40: 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
7a50: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
7a60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7a70: 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
7a80: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
7a90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
7aa0: 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
7ab0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
7ac0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7ad0: 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
7ae0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
7af0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
7b00: 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
7b10: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
7b20: 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
7b30: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
7b40: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
7b50: 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
7b60: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
7b70: 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
7b80: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
7b90: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
7ba0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
7bb0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
7bc0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
7bd0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
7be0: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
7bf0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
7c00: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
7c10: 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
7c20: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
7c30: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
7c40: 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
7c50: 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
7c60: 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
7c70: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7c80: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
7c90: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
7ca0: 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
7cb0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
7cc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
7cd0: 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
7ce0: 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
7cf0: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
7d00: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
7d10: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7d20: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
7d30: 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
7d40: 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
7d50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
7d60: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
7d70: 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
7d80: 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
7d90: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7da0: 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
7db0: 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
7dc0: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
7dd0: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
7de0: 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
7df0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
7e00: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7e10: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
7e20: 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
7e30: 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
7e40: 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
7e50: 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
7e60: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
7e70: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
7e80: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
7e90: 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
7ea0: 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
7eb0: 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
7ec0: 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
7ed0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
7ee0: 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
7ef0: 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
7f00: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
7f10: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
7f20: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
7f30: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
7f40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
7f50: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
7f60: 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
7f70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
7f80: 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ..  TRACE_IDX_IN
7f90: 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
7fa0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
7fb0: 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
7fc0: 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
7fd0: 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
7fe0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7ff0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
8000: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
8010: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
8020: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8030: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
8040: 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
8050: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
8060: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8070: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
8080: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
8090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
80a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
80b0: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
80c0: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
80d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
80e0: 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
80f0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
8100: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
8110: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8120: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
8130: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61  ){.    if( !p->a
8140: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
8150: 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73  able && p->aCons
8160: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
8170: 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
8180: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8190: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
81a0: 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
81b0: 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
81c0: 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
81d0: 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
81e0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
81f0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
8200: 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
8210: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
8220: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8230: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65  TABLE) */..#ifde
8240: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8250: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
8260: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
8270: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
8280: 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
8290: 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
82a0: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
82b0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
82c0: 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
82d0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
82e0: 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
82f0: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
8300: 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a   less than pRec.
8310: 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
8320: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
8330: 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
8340: 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pRec.**.** Retu
8350: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
8360: 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20  the sample that 
8370: 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  is the smallest 
8380: 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69  sample that.** i
8390: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
83a0: 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e  r equal to pRec.
83b0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
83c0: 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20  index is not an 
83d0: 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68  index.** into th
83e0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
83f0: 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64  y - it is an ind
8400: 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61  ex into a virtua
8410: 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  l set of samples
8420: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
8430: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61   contents of aSa
8440: 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e  mple[] and the n
8450: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
8460: 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52  in record .** pR
8470: 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ec. .*/.static i
8480: 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
8490: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
84a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
84b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
84c0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
84d0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
84e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
84f0: 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
8500: 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61  ain of */.  Unpa
8510: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
8520: 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f  ,       /* Vecto
8530: 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63  r of values to c
8540: 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
8550: 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
8560: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
8570: 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
8580: 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
8590: 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
85a0: 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
85b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
85c0: 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
85d0: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70  /.){.  IndexSamp
85e0: 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
85f0: 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69  dx->aSample;.  i
8600: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
8610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8620: 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20  dex of required 
8630: 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20  stats in anEq[] 
8640: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  etc. */.  int i;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8670: 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e  f first sample >
8680: 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20  = pRec */.  int 
8690: 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  iSample;        
86a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
86b0: 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65  est sample large
86c0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
86d0: 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74  to pRec */.  int
86e0: 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20   iMin = 0;      
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
8700: 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20  lest sample not 
8710: 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  yet tested */.  
8720: 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
8730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8740: 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
8750: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
8780: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
8790: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
87a0: 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Field;          
87b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
87c0: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52   of fields in pR
87d0: 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ec */.  tRowcnt 
87e0: 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20  iLower = 0;     
87f0: 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20      /* anLt[] + 
8800: 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73  anEq[] of larges
8810: 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73  t sample pRec is
8820: 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53   > */..#ifndef S
8830: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
8840: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
8850: 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66  pParse );.#endif
8860: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 21  .  assert( pRec!
8870: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8880: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  pIdx->nSample>0 
8890: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
88a0: 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70  c->nField>0 && p
88b0: 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64  Rec->nField<=pId
88c0: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b  x->nSampleCol );
88d0: 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61  ..  /* Do a bina
88e0: 72 79 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e  ry search to fin
88f0: 64 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  d the first samp
8900: 6c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  le greater than 
8910: 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f  or equal.  ** to
8920: 20 70 52 65 63 2e 20 49 66 20 70 52 65 63 20 63   pRec. If pRec c
8930: 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
8940: 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20   field, the set 
8950: 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65  of samples to se
8960: 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d  arch.  ** is sim
8970: 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  ply the aSample[
8980: 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20  ] array. If the 
8990: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
89a0: 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  le[] contain mor
89b0: 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20  e.  ** than one 
89c0: 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c  fields, all fiel
89d0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ds following the
89e0: 20 66 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72   first are ignor
89f0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
8a00: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e   pRec contains N
8a10: 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e   fields, where N
8a20: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
8a30: 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20  e, then as well 
8a40: 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70  as the.  ** samp
8a50: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
8a60: 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e   (truncated to N
8a70: 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65   fields), the se
8a80: 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f  arch also has to
8a90: 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70  .  ** consider p
8aa0: 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65  refixes of those
8ab0: 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78   samples. For ex
8ac0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65  ample, if the se
8ad0: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a  t of samples.  *
8ae0: 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a  * in aSample is:
8af0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61  .  **.  **     a
8b00: 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20  Sample[0] = (a, 
8b10: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
8b20: 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30  mple[1] = (a, 10
8b30: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
8b40: 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20  ple[2] = (b, 5) 
8b50: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8b60: 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20  e[3] = (c, 100) 
8b70: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8b80: 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a  e[4] = (c, 105).
8b90: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
8ba0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
8bb0: 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62  should ideally b
8bc0: 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62  e the samples ab
8bd0: 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ove and the .  *
8be0: 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 65  * unique prefixe
8bf0: 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b  s [a], [b] and [
8c00: 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68  c]. But since th
8c10: 61 74 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72  at is hard to or
8c20: 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68  ganize, .  ** th
8c30: 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20  e code actually 
8c40: 73 65 61 72 63 68 65 73 20 74 68 69 73 20 73 65  searches this se
8c50: 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t:.  **.  **    
8c60: 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20   0: (a) .  **   
8c70: 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a    1: (a, 5) .  *
8c80: 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29  *     2: (a, 10)
8c90: 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61   .  **     3: (a
8ca0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
8cb0: 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20  4: (b) .  **    
8cc0: 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a   5: (b, 5) .  **
8cd0: 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a       6: (c) .  *
8ce0: 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30  *     7: (c, 100
8cf0: 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28  ) .  **     8: (
8d00: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20  c, 105).  **    
8d10: 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   9: (c, 105).  *
8d20: 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  *.  ** For each 
8d30: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53  sample in the aS
8d40: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e  ample[] array, N
8d50: 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65   samples are pre
8d60: 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a  sent in the.  **
8d70: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
8d80: 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20  e array. In the 
8d90: 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30  above, samples 0
8da0: 20 61 6e 64 20 31 20 61 72 65 20 62 61 73 65 64   and 1 are based
8db0: 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   on .  ** sample
8dc0: 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d   aSample[0]. Sam
8dd0: 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20  ples 2 and 3 on 
8de0: 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a  aSample[1] etc..
8df0: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c    **.  ** Often,
8e00: 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63   sample i of eac
8e10: 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66  h block of N eff
8e20: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68  ective samples h
8e30: 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e  as (i+1) fields.
8e40: 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61  .  ** Except, ea
8e50: 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65  ch sample may be
8e60: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73   extended to ens
8e70: 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20 67  ure that it is g
8e80: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20  reater than or. 
8e90: 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65   ** equal to the
8ea0: 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65   previous sample
8eb0: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46   in the array. F
8ec0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74  or example, in t
8ed0: 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20  he above, .  ** 
8ee0: 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20  sample 2 is the 
8ef0: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20  first sample of 
8f00: 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d  a block of N sam
8f10: 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73  ples, so at firs
8f20: 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61  t it .  ** appea
8f30: 72 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  rs that it shoul
8f40: 64 20 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20  d be 1 field in 
8f50: 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74  size. However, t
8f60: 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69  hat would make i
8f70: 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20  t .  ** smaller 
8f80: 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73  than sample 1, s
8f90: 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
8fa0: 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f  rch would not wo
8fb0: 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c  rk. As a result,
8fc0: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74   .  ** it is ext
8fd0: 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65  ended to two fie
8fe0: 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61  lds. The duplica
8ff0: 74 65 73 20 74 68 61 74 20 74 68 69 73 20 63 72  tes that this cr
9000: 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20  eates do not .  
9010: 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
9020: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46  blems..  */.  nF
9030: 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69  ield = pRec->nFi
9040: 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b  eld;.  iCol = 0;
9050: 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64  .  iSample = pId
9060: 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69  x->nSample * nFi
9070: 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  eld;.  do{.    i
9080: 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20  nt iSamp;       
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
90a0: 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65  Index in aSample
90b0: 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c  [] of test sampl
90c0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20  e */.    int n; 
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
90f0: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65   of fields in te
9100: 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20  st sample */..  
9110: 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b    iTest = (iMin+
9120: 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20  iSample)/2;.    
9130: 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20  iSamp = iTest / 
9140: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20  nField;.    if( 
9150: 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20  iSamp>0 ){.     
9160: 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64   /* The proposed
9170: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
9180: 65 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  e is a prefix of
9190: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
91a0: 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a  iSamp]..      **
91b0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
91c0: 68 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66  he shortest pref
91d0: 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28  ix of at least (
91e0: 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64  1 + iTest%nField
91f0: 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c  ) .      ** fiel
9200: 64 73 20 74 68 61 74 20 69 73 20 67 72 65 61 74  ds that is great
9210: 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  er than the prev
9220: 69 6f 75 73 20 65 66 66 65 63 74 69 76 65 20 73  ious effective s
9230: 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  ample.  */.     
9240: 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20   for(n=(iTest % 
9250: 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e  nField) + 1; n<n
9260: 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20  Field; n++){.   
9270: 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
9280: 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e  [iSamp-1].anLt[n
9290: 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61  -1]!=aSample[iSa
92a0: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20  mp].anLt[n-1] ) 
92b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
92c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92d0: 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20  n = iTest + 1;. 
92e0: 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e     }..    pRec->
92f0: 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20  nField = n;.    
9300: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
9310: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
9320: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c  Sample[iSamp].n,
9330: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9340: 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66  p, pRec);.    if
9350: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
9360: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
9370: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
9380: 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61  1] + aSample[iSa
9390: 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20  mp].anEq[n-1];. 
93a0: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
93b0: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t+1;.    }else i
93c0: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e  f( res==0 && n<n
93d0: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69  Field ){.      i
93e0: 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
93f0: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
9400: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
9410: 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65  Test+1;.      re
9420: 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  s = -1;.    }els
9430: 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65  e{.      iSample
9440: 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20   = iTest;.      
9450: 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20  iCol = n-1;.    
9460: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
9470: 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20  && iMin<iSample 
9480: 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65  );.  i = iSample
9490: 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64   / nField;..#ifd
94a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
94b0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
94c0: 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
94d0: 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20  ents check that 
94e0: 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
94f0: 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76  h code.  ** abov
9500: 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68  e found the righ
9510: 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62  t answer. This b
9520: 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70  lock serves no p
9530: 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a  urpose other.  *
9540: 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65  * than to invoke
9550: 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a   the asserts.  *
9560: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
9570: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9580: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==0 ){.    if( r
9590: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
95a0: 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
95b0: 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63   true, then pRec
95c0: 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74   must be equal t
95d0: 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20  o sample i. */. 
95e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
95f0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
9600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
9610: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
9620: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
9630: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ld = nField;.   
9640: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
9650: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
9660: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
9670: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
9680: 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20 20 20  p, pRec) .      
9690: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
96a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
96b0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d   .      );.    }
96c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
96d0: 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e  nless i==pIdx->n
96e0: 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69  Sample, indicati
96f0: 6e 67 20 74 68 61 74 20 70 52 65 63 20 69 73 20  ng that pRec is 
9700: 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20  larger than.    
9710: 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73    ** all samples
9720: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
9730: 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75  ] array, pRec mu
9740: 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
9750: 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  an the.      ** 
9760: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
9770: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
9780: 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  i.  */.      ass
9790: 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53  ert( i<=pIdx->nS
97a0: 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b  ample && i>=0 );
97b0: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  .      pRec->nFi
97c0: 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  eld = iCol+1;.  
97d0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
97e0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  Idx->nSample .  
97f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
9800: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
9810: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
9820: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
9830: 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
9840: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
9850: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9860: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  );..      /* if 
9870: 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30  i==0 and iCol==0
9880: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52  , then record pR
9890: 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ec is smaller th
98a0: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20  an all samples. 
98b0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61       ** in the a
98c0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
98d0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 28 69  Otherwise, if (i
98e0: 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63  Col>0) then pRec
98f0: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
9900: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
9910: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28  r equal to the (
9920: 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66  iCol) field pref
9930: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a  ix of sample i..
9940: 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30        ** If (i>0
9950: 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  ), then pRec mus
9960: 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65  t also be greate
9970: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69  r than sample (i
9980: 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  -1).  */.      i
9990: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
99a0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
99b0: 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  d = iCol;.      
99c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
99d0: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
99e0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
99f0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
9a00: 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20  Rec)<=0.        
9a10: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
9a20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9a30: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9a40: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
9a50: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
9a60: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  d = nField;.    
9a70: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9a80: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
9a90: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
9aa0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
9ab0: 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20  ].p, pRec)<0.   
9ac0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
9ad0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9ae0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
9af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
9b00: 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
9b10: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66  E_DEBUG */..  if
9b20: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
9b30: 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63 20 69  /* Record pRec i
9b40: 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  s equal to sampl
9b50: 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e i */.    asser
9b60: 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
9b70: 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  1 );.    aStat[0
9b80: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
9b90: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
9ba0: 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
9bb0: 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
9bc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
9bd0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
9be0: 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65  the (iCol+1) fie
9bf0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61 53 61  ld prefix of aSa
9c00: 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
9c10: 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d  irst .    ** sam
9c20: 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
9c30: 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f  ter than pRec. O
9c40: 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  r, if i==pIdx->n
9c50: 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63  Sample then pRec
9c60: 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65  .    ** is large
9c70: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
9c80: 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  es in the array.
9c90: 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
9ca0: 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
9cb0: 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e    if( i>=pIdx->n
9cc0: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
9cd0: 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33  iUpper = sqlite3
9ce0: 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78  LogEstToInt(pIdx
9cf0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
9d00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9d10: 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
9d20: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
9d30: 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l];.    }..    i
9d40: 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
9d50: 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  r ){.      iGap 
9d60: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
9d70: 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70        iGap = iUp
9d80: 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
9d90: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e    }.    if( roun
9da0: 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61  dUp ){.      iGa
9db0: 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a  p = (iGap*2)/3;.
9dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9dd0: 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a   iGap = iGap/3;.
9de0: 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
9df0: 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47  0] = iLower + iG
9e00: 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  ap;.    aStat[1]
9e10: 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b   = pIdx->aAvgEq[
9e20: 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iCol];.  }..  /*
9e30: 20 52 65 73 74 6f 72 65 20 74 68 65 20 70 52 65   Restore the pRe
9e40: 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20  c->nField value 
9e50: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
9e60: 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46  .  */.  pRec->nF
9e70: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
9e80: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e   return i;.}.#en
9e90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
9ea0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
9eb0: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT4 */../*.** If
9ec0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
9ed0: 20 70 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d   pTerm is a term
9ee0: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
9ef0: 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  n upper or lower
9f00: 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72  .** bound on a r
9f10: 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f  ange scan. Witho
9f20: 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70  ut considering p
9f30: 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69  Term, it is esti
9f40: 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74  mated .** that t
9f50: 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  he scan will vis
9f60: 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68  it nNew rows. Th
9f70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9f80: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  rns the number.*
9f90: 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62  * estimated to b
9fa0: 65 20 76 69 73 69 74 65 64 20 61 66 74 65 72 20  e visited after 
9fb0: 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74  taking pTerm int
9fc0: 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a  o account..**.**
9fd0: 20 49 66 20 74 68 65 20 75 73 65 72 20 65 78 70   If the user exp
9fe0: 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
9ff0: 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  d a likelihood()
a000: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
a010: 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  term,.** then th
a020: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
a030: 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64  s the likelihood
a040: 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74   multiplied by t
a050: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
a060: 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65  input rows. Othe
a070: 72 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63  rwise, this func
a080: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
a090: 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c  t an "IS NOT NUL
a0a0: 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61  L" term.** has a
a0b0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
a0c0: 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68  .50, and any oth
a0d0: 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69  er term a likeli
a0e0: 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f  hood of 0.25..*/
a0f0: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
a100: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
a110: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
a120: 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a  , LogEst nNew){.
a130: 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20    LogEst nRet = 
a140: 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72  nNew;.  if( pTer
a150: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  m ){.    if( pTe
a160: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
a170: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b   ){.      nRet +
a180: 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
a190: 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ob;.    }else if
a1a0: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
a1b0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
a1c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
a1d0: 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61   -= 20;        a
a1e0: 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74  ssert( 20==sqlit
a1f0: 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20  e3LogEst(4) );. 
a200: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a210: 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64  n nRet;.}...#ifd
a220: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a230: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
a240: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
a250: 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20   affinity for a 
a260: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
a270: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
a280: 61 74 69 63 20 63 68 61 72 20 73 71 6c 69 74 65  atic char sqlite
a290: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
a2a0: 6e 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62  nity(sqlite3 *db
a2b0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
a2c0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 66 28 20  nt iCol){.  if( 
a2d0: 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29  !pIdx->zColAff )
a2e0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
a2f0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
a300: 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29  r(db, pIdx)==0 )
a310: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
a320: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72  FF_BLOB;.  }.  r
a330: 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c  eturn pIdx->zCol
a340: 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e  Aff[iCol];.}.#en
a350: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
a360: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a370: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a  _OR_STAT4./* .**
a380: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
a390: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
a3a0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
a3b0: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
a3c0: 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63  by a.** range-sc
a3d0: 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61  an on a skip-sca
a3e0: 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61  n index. For exa
a3f0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  mple:.**.**   CR
a400: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
a410: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a   t1(a, b, c);.**
a420: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
a430: 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e   t1 WHERE a=? AN
a440: 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  D c BETWEEN ? AN
a450: 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65  D ?;.**.** Value
a460: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20   pLoop->nOut is 
a470: 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
a480: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
a490: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a  umber of rows .*
a4a0: 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63  * visited for sc
a4b0: 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20  anning (a=? AND 
a4c0: 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74  b=?). This funct
a4d0: 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74  ion reduces that
a4e0: 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79   estimate .** by
a4f0: 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20   some factor to 
a500: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
a510: 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  (c BETWEEN ? AND
a520: 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62   ?) expression b
a530: 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ased.** on the s
a540: 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68  tat4 data for th
a550: 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63  e index. this sc
a560: 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72  an will be pefor
a570: 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  med multiple .**
a580: 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72   times (once for
a590: 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62   each (a,b) comb
a5a0: 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74  ination that mat
a5b0: 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61  ches a=?) is dea
a5c0: 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74  lt with .** by t
a5d0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
a5e0: 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79   It does this by
a5f0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
a600: 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70  h all stat4 samp
a610: 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76  les, comparing v
a620: 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74  alues.** extract
a630: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61  ed from pLower a
a640: 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74  nd pUpper with t
a650: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a660: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a   column in each.
a670: 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20  ** sample. If L 
a680: 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75  and U are the nu
a690: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
a6a0: 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73  found to be less
a6b0: 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61   than or.** equa
a6c0: 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20  l to the values 
a6d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
a6e0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
a6f0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61   respectively, a
a700: 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74  nd.** N is the t
a710: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
a720: 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f  amples, the pLoo
a730: 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73  p->nOut value is
a740: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20   adjusted.** as 
a750: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a760: 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28   nOut = nOut * (
a770: 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f   min(U - L, 1) /
a780: 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c   N ).**.** If pL
a790: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  ower is NULL, or
a7a0: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
a7b0: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
a7c0: 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73  m the term, L is
a7d0: 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  .** set to zero.
a7e0: 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55   If pUpper is NU
a7f0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
a800: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
a810: 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55  ed from it,.** U
a820: 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a   is set to N..**
a830: 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  .** Normally, th
a840: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
a850: 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65   *pbDone to 1 be
a860: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
a870: 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e  However,.** if n
a880: 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65  o value can be e
a890: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69  xtracted from ei
a8a0: 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70  ther pLower or p
a8b0: 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68  Upper (and so th
a8c0: 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66  e.** estimate of
a8d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a8e0: 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65  ows delivered re
a8f0: 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29  mains unchanged)
a900: 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20  , *pbDone.** is 
a910: 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a  left as is..**.*
a920: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
a930: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
a940: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
a950: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
a960: 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  e, .** SQLITE_OK
a970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a980: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
a990: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
a9a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
a9b0: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
a9c0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
a9d0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
a9e0: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
a9f0: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
aa00: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
aa10: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
aa20: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
aa30: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
aa40: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
aa50: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
aa60: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
aa70: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
aa80: 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f  oop *pLoop,    /
aa90: 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f  * Update the .nO
aaa0: 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ut value of this
aab0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a   loop */.  int *
aac0: 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  pbDone          
aad0: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
aae0: 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65  f at least one e
aaf0: 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61  xpr. value extra
ab00: 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  cted */.){.  Ind
ab10: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
ab20: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
ab30: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
ab40: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
ab50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ab60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
ab70: 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20   nLower = -1;.  
ab80: 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e  int nUpper = p->
ab90: 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74  nSample+1;.  int
aba0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
abb0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d  .  int iCol = p-
abc0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
abd0: 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74    u8 aff = sqlit
abe0: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
abf0: 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 69 43 6f  inity(db, p, iCo
ac00: 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l);.  CollSeq *p
ac10: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74  Coll;.  .  sqlit
ac20: 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30  e3_value *p1 = 0
ac30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
ac40: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
ac50: 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73  om pLower */.  s
ac60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32  qlite3_value *p2
ac70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
ac80: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
ac90: 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f  d from pUpper */
aca0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
acb0: 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20   *pVal = 0;     
acc0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
acd0: 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72  acted from recor
ace0: 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  d */..  pColl = 
acf0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
ad00: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
ad10: 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20  azColl[nEq]);.  
ad20: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
ad30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
ad40: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
ad50: 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d  (pParse, pLower-
ad60: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
ad70: 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e  aff, &p1);.    n
ad80: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  Lower = 0;.  }. 
ad90: 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72   if( pUpper && r
ada0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
adb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
adc0: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
add0: 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65  pr(pParse, pUppe
ade0: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
adf0: 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20  , aff, &p2);.   
ae00: 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30   nUpper = p2 ? 0
ae10: 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20   : p->nSample;. 
ae20: 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20   }..  if( p1 || 
ae30: 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  p2 ){.    int i;
ae40: 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a  .    int nDiff;.
ae50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
ae60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
ae70: 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  p->nSample; i++)
ae80: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
ae90: 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28  ite3Stat4Column(
aea0: 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  db, p->aSample[i
aeb0: 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ].p, p->aSample[
aec0: 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c  i].n, nEq, &pVal
aed0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
aee0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
aef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
af00: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
af10: 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c  Compare(p1, pVal
af20: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
af30: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
af40: 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Lower++;.      }
af50: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
af60: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29  QLITE_OK && p2 )
af70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
af80: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
af90: 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20  mpare(p2, pVal, 
afa0: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
afb0: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70  if( res>=0 ) nUp
afc0: 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  per++;.      }. 
afd0: 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d     }.    nDiff =
afe0: 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65   (nUpper - nLowe
aff0: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66  r);.    if( nDif
b000: 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31  f<=0 ) nDiff = 1
b010: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b020: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
b030: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  per and lower bo
b040: 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61  und specified, a
b050: 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  nd the .    ** c
b060: 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63  omparisons indic
b070: 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72  ate that they ar
b080: 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72  e close together
b090: 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61  , use the fallba
b0a0: 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ck.    ** method
b0b0: 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68   (assume that th
b0c0: 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f  e scan visits 1/
b0d0: 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20  64 of the rows) 
b0e0: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20  for estimating. 
b0f0: 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
b100: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
b110: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74  . Otherwise, est
b120: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
b130: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20   of rows.    ** 
b140: 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64  using the method
b150: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
b160: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
b170: 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
b180: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  on. */.    if( n
b190: 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65  Diff!=1 || pUppe
b1a0: 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d  r==0 || pLower==
b1b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
b1c0: 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65  Adjust = (sqlite
b1d0: 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70  3LogEst(p->nSamp
b1e0: 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67  le) - sqlite3Log
b1f0: 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20  Est(nDiff));.   
b200: 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d     pLoop->nOut -
b210: 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20  = nAdjust;.     
b220: 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20   *pbDone = 1;.  
b230: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
b240: 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69  x10, ("range ski
b250: 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  p-scan regions: 
b260: 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25  %u..%u  adjust=%
b270: 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  d est=%d\n",.   
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20          nLower, 
b2a0: 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a  nUpper, nAdjust*
b2b0: 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29  -1, pLoop->nOut)
b2c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
b2d0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
b2e0: 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d  pbDone==0 );.  }
b2f0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
b300: 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69  Free(p1);.  sqli
b310: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29  te3ValueFree(p2)
b320: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
b330: 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
b340: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
b350: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
b360: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
b370: 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  T4 */../*.** Thi
b380: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
b390: 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
b3a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
b3b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
b3c0: 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
b3d0: 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
b3e0: 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
b3f0: 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
b400: 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
b410: 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
b420: 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
b430: 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
b440: 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
b450: 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
b460: 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
b470: 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
b480: 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
b490: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
b4a0: 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
b4b0: 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
b4c0: 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
b4d0: 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
b4e0: 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
b4f0: 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
b500: 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
b510: 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
b520: 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
b550: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
b560: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
b570: 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
b580: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
b590: 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
b5a0: 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
b5b0: 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
b5c0: 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
b5d0: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
b5e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
b5f0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
b600: 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c   value in (pBuil
b610: 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
b620: 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e  ee.nEq) is the n
b630: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
b640: 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62  ex.** column sub
b650: 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67  ject to the rang
b660: 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
b670: 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
b680: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
b690: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
b6a0: 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20  aints optimized 
b6b0: 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
b6c0: 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
b6d0: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75  example,.** assu
b6e0: 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20  ming index p is 
b6f0: 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
b700: 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
b710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
b720: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
b730: 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
b740: 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
b750: 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
b760: 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61   to 1 (as the ra
b770: 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63  nge restricted c
b780: 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65  olumn, b, is the
b790: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74   second .** left
b7a0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
b7b0: 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
b7c0: 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
b7d0: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
b7e0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
b7f0: 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
b800: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
b810: 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a   set to 0..**.**
b820: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
b830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
b840: 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pnOut is set to 
b850: 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  the sqlite3LogEs
b860: 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  t() of the.** nu
b870: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
b880: 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  t the index scan
b890: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
b8a0: 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a  visit without .*
b8b0: 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  * considering th
b8c0: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
b8d0: 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30  nts. If nEq is 0
b8e0: 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73  , then *pnOut is
b8f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
b900: 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  ** rows in the i
b910: 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ndex. Assuming n
b920: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
b930: 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74  *pnOut is adjust
b940: 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20  ed (reduced).** 
b950: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
b960: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
b970: 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
b980: 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
b990: 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
b9a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
b9b0: 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
b9c0: 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
b9d0: 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61  ot be.** used, a
b9e0: 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e   single range in
b9f0: 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
ba00: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
ba10: 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
ba20: 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61   4. .** and a pa
ba30: 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ir of constraint
ba40: 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
ba50: 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65  reduces the expe
ba60: 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  cted number of.*
ba70: 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  * rows visited b
ba80: 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34  y a factor of 64
ba90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
baa0: 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
bab0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
bac0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
bad0: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
bae0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
baf0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
bb00: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
bb10: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
bb20: 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
bb30: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
bb40: 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
bb50: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
bb60: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
bb70: 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
bb80: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
bb90: 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
bba0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
bbb0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
bbc0: 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69  Loop     /* Modi
bbd0: 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64  fy the .nOut and
bbe0: 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65   maybe .rRun fie
bbf0: 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lds */.){.  int 
bc00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bc10: 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f    int nOut = pLo
bc20: 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45  op->nOut;.  LogE
bc30: 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66  st nNew;..#ifdef
bc40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
bc50: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
bc60: 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
bc70: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
bc80: 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
bc90: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
bca0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  ;..  if( p->nSam
bcb0: 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e  ple>0 && nEq<p->
bcc0: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20  nSampleCol ){.  
bcd0: 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
bce0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
bcf0: 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
bd00: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
bd10: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
bd20: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
bd30: 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b  ];.      u8 aff;
bd40: 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
bd50: 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
bd60: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
bd70: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
bd80: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
bd90: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
bda0: 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
bdb0: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
bdc0: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
bdd0: 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
bde0: 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
bdf0: 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
be00: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
be10: 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
be20: 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
be30: 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
be40: 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
be50: 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
be60: 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
be70: 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
be80: 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
be90: 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
bea0: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
beb0: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
bec0: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
bed0: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
bee0: 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
bef0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
bf00: 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
bf10: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
bf20: 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
bf30: 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
bf40: 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
bf50: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
bf60: 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
bf70: 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
bf80: 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
bf90: 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
bfa0: 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
bfb0: 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
bfc0: 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
bfd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
bfe0: 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
bff0: 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
c000: 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
c010: 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
c020: 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65  ed values is use
c030: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
c040: 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
c050: 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
c060: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
c070: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
c080: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
c090: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
c0a0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
c0b0: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
c0c0: 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
c0d0: 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
c0e0: 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
c0f0: 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
c100: 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
c110: 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
c120: 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
c130: 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
c140: 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
c150: 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
c160: 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
c170: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c180: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
c190: 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68   rows between th
c1a0: 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20  e two bounds is 
c1b0: 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72  then just iUpper
c1c0: 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a  -iLower..      *
c1d0: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
c1e0: 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52  iLower;     /* R
c1f0: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
c200: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
c210: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c220: 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Upper;     /* Ro
c230: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c240: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
c250: 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64        int iLwrId
c260: 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61  x = -2;   /* aSa
c270: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c  mple[] for the l
c280: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
c290: 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20      int iUprIdx 
c2a0: 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -1;   /* aSamp
c2b0: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70  le[] for the upp
c2c0: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20  er bound */..   
c2d0: 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20     if( pRec ){. 
c2e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c2f0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70   pRec->nField!=p
c300: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
c310: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  id );.        pR
c320: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75  ec->nField = pBu
c330: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c350: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  aff = sqlite3Ind
c360: 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  exColumnAffinity
c370: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
c380: 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nEq);.      asse
c390: 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79  rt( nEq!=p->nKey
c3a0: 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  Col || aff==SQLI
c3b0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
c3c0: 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  ;.      /* Deter
c3d0: 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20  mine iLower and 
c3e0: 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50  iUpper using ($P
c3f0: 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  ) only. */.     
c400: 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20   if( nEq==0 ){. 
c410: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
c420: 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  0;.        iUppe
c430: 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b  r = p->nRowEst0;
c440: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c450: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74        /* Note: t
c460: 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62  his call could b
c470: 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79  e optimized away
c480: 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d   - since the sam
c490: 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20  e values must . 
c4a0: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62         ** have b
c4b0: 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68  een requested wh
c4c0: 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24  en testing key $
c4d0: 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53  P in whereEqualS
c4e0: 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20  canEst().  */.  
c4f0: 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
c500: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
c510: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
c520: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
c530: 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ];.        iUppe
c540: 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
c550: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c560: 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d  assert( pLower==
c570: 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  0 || (pLower->eO
c580: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
c590: 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
c5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70       assert( pUp
c5b0: 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65  per==0 || (pUppe
c5c0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
c5d0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30  WO_LT|WO_LE))!=0
c5e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c5f0: 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  ( p->aSortOrder!
c600: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
c610: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  p->aSortOrder[nE
c620: 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  q] ){.        /*
c630: 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c   The roles of pL
c640: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
c650: 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20  are swapped for 
c660: 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a  a DESC index */.
c670: 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65          SWAP(Whe
c680: 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c  reTerm*, pLower,
c690: 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20   pUpper);.      
c6a0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
c6b0: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
c6c0: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
c6d0: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
c6e0: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
c6f0: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
c700: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
c730: 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
c740: 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
c750: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
c760: 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
c770: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
c780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c790: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
c7a0: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
c7b0: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
c7c0: 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
c7d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c7e0: 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
c7f0: 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e            tRowcn
c800: 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
c810: 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72    iLwrIdx = wher
c820: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
c830: 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
c840: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
c850: 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77   = a[0] + ((pLow
c860: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
c870: 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f  (WO_GT|WO_LE)) ?
c880: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
c890: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69        if( iNew>i
c8a0: 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
c8b0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
c8c0: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
c8d0: 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     pLower = 0;. 
c8e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c8f0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
c900: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
c910: 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73  on the iUpper es
c920: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
c930: 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$U). */.      i
c940: 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
c950: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
c980: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
c990: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
c9a0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
c9b0: 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
c9c0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
c9d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
c9e0: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
c9f0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
ca00: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
ca10: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
ca20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ca30: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
ca40: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
ca50: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
ca60: 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65   iUprIdx = where
ca70: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
ca80: 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b   p, pRec, 1, a);
ca90: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
caa0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
cab0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
cac0: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
cad0: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
cae0: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
caf0: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
cb00: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
cb10: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
cb20: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
cb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cb40: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
cb50: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
cb60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cb70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
cb80: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
cb90: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
cba0: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
cbb0: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
cbc0: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
cbd0: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
cbe0: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
cbf0: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
cc00: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
cc10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
cc20: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
cc30: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
cc40: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
cc50: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
cc60: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
cc70: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
cc80: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
cc90: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
cca0: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
ccb0: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
ccc0: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
ccd0: 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73  f STAT3/4 tables
cce0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
ccf0: 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72  f( iLwrIdx==iUpr
cd00: 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30  Idx ) nNew -= 20
cd10: 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73  ;  assert( 20==s
cd20: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
cd30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
cd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
cd50: 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
cd60: 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
cd70: 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
cd80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cd90: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
cda0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
cdb0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
cdc0: 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  }.        WHERET
cdd0: 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41  RACE(0x10, ("STA
cde0: 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25  T4 range scan: %
cdf0: 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
ce00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
ce20: 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
ce30: 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
ce40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
ce50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e  {.      int bDon
ce60: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
ce70: 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  = whereRangeSkip
ce80: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
ce90: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20  pLower, pUpper, 
cea0: 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a  pLoop, &bDone);.
ceb0: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20        if( bDone 
cec0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
ced0: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
cee0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cef0: 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
cf00: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
cf10: 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  lder);.  assert(
cf20: 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
cf30: 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  r );.#endif.  as
cf40: 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
cf50: 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c  || (pUpper->wtFl
cf60: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
cf70: 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d  )==0 );.  nNew =
cf80: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
cf90: 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b  t(pLower, nOut);
cfa0: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
cfb0: 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65  angeAdjust(pUppe
cfc0: 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20  r, nNew);..  /* 
cfd0: 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
cfe0: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
cff0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69  r and lower limi
d000: 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69  t and neither li
d010: 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20  mit.  ** has an 
d020: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
d030: 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  ned likelihood()
d040: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e  , assume the ran
d050: 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63  ge is.  ** reduc
d060: 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ed by an additio
d070: 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65  nal 75%. This me
d080: 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66  ans that, by def
d090: 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e  ault, an open-en
d0a0: 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71  ded.  ** range q
d0b0: 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e  uery (e.g. col >
d0c0: 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74   ?) is assumed t
d0d0: 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74  o match 1/4 of t
d0e0: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  he rows in the. 
d0f0: 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65   ** index. While
d100: 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20   a closed range 
d110: 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45  (e.g. col BETWEE
d120: 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73  N ? AND ?) is es
d130: 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  timated to.  ** 
d140: 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68  match 1/64 of th
d150: 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69  e index. */ .  i
d160: 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f  f( pLower && pLo
d170: 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  wer->truthProb>0
d180: 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55   && pUpper && pU
d190: 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  pper->truthProb>
d1a0: 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
d1b0: 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74   20;.  }..  nOut
d1c0: 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20   -= (pLower!=0) 
d1d0: 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20  + (pUpper!=0);. 
d1e0: 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e   if( nNew<10 ) n
d1f0: 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20  New = 10;.  if( 
d200: 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74  nNew<nOut ) nOut
d210: 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66   = nNew;.#if def
d220: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
d230: 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70  ENABLED).  if( p
d240: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  Loop->nOut>nOut 
d250: 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
d260: 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73  E(0x10,("Range s
d270: 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20  can lowers nOut 
d280: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
d290: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d2a0: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
d2b0: 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23  t, nOut));.  }.#
d2c0: 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  endif.  pLoop->n
d2d0: 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
d2e0: 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
d2f0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
d300: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
d310: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
d320: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
d330: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
d340: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
d350: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
d360: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
d370: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
d380: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
d390: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
d3a0: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
d3b0: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
d3c0: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
d3d0: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
d3e0: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
d3f0: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
d400: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
d410: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
d420: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
d430: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
d440: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
d450: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
d460: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
d470: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
d480: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
d490: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
d4a0: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
d4b0: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
d4c0: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
d4d0: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
d4e0: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
d4f0: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
d500: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
d510: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
d520: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
d530: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
d540: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
d550: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
d560: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
d570: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
d580: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
d590: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
d5a0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
d5b0: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
d5c0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
d5d0: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
d5e0: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
d5f0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
d600: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
d610: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
d620: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
d630: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d640: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
d650: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
d660: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
d670: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
d680: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
d690: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
d6a0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
d6b0: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
d6c0: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
d6d0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
d6e0: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
d6f0: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
d700: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
d710: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
d720: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
d730: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
d740: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
d750: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
d760: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
d770: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
d780: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
d790: 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b  >pRec;.  u8 aff;
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
d7c0: 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
d7d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d7e0: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
d7f0: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
d800: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
d810: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
d820: 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
d830: 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73    int bOk;..  as
d840: 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a  sert( nEq>=1 );.
d850: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70    assert( nEq<=p
d860: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ->nColumn );.  a
d870: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
d880: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
d890: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
d8a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  ;.  assert( pBui
d8b0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
d8c0: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nEq );..  /* If 
d8d0: 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61  values are not a
d8e0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
d8f0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69   fields of the i
d900: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74  ndex to the left
d910: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e  .  ** of this on
d920: 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63  e, no estimate c
d930: 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75  an be made. Retu
d940: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
d950: 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ND. */.  if( pBu
d960: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
d970: 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20  <(nEq-1) ){.    
d980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d990: 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f  TFOUND;.  }..  /
d9a0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
d9b0: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
d9c0: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
d9d0: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
d9e0: 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c  Value().  ** bel
d9f0: 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20  ow would return 
da00: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20  the same value. 
da10: 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70   */.  if( nEq>=p
da20: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
da30: 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
da40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
da50: 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20  K;.  }..  aff = 
da60: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
da70: 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  mnAffinity(pPars
da80: 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29  e->db, p, nEq-1)
da90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
daa0: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
dab0: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
dac0: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
dad0: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
dae0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
daf0: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
db00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
db10: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
db20: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
db30: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
db40: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
db50: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
db60: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
db70: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
db80: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
db90: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
dba0: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ty scan regions:
dbb0: 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31   %d\n", (int)a[1
dbc0: 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20  ]));.  *pnRow = 
dbd0: 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72  a[1];.  .  retur
dbe0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
dbf0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
dc00: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
dc10: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
dc20: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
dc30: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
dc40: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
dc50: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
dc60: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
dc70: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
dc80: 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
dc90: 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
dca0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
dcb0: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
dcc0: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
dcd0: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
dce0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
dcf0: 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
dd00: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
dd10: 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
dd20: 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
dd30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dd40: 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
dd50: 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
dd60: 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
dd70: 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
dd80: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
dd90: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
dda0: 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
ddb0: 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
ddc0: 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
ddd0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
dde0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
ddf0: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
de00: 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
de10: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
de20: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
de30: 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
de40: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
de50: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
de60: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
de70: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
de80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
de90: 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
dea0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
deb0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
dec0: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
ded0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
dee0: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
def0: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
df00: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
df10: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
df20: 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
df30: 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
df40: 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
df50: 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
df60: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
df70: 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
df80: 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
df90: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
dfa0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
dfb0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
dfc0: 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c   i64 nRow0 = sql
dfd0: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
dfe0: 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  p->aiRowLogEst[0
dff0: 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ]);.  int nRecVa
e000: 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
e010: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
e020: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e030: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
e040: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
e050: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
e060: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
e070: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
e080: 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
e090: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
e0a0: 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
e0b0: 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
e0c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e0d0: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e100: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
e110: 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
e120: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
e130: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
e140: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
e150: 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f  {.    nEst = nRo
e160: 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  w0;.    rc = whe
e170: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
e180: 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
e190: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
e1a0: 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
e1b0: 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
e1c0: 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
e1d0: 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
e1e0: 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  alid;.  }..  if(
e1f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e200: 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  {.    if( nRowEs
e210: 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77  t > nRow0 ) nRow
e220: 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20  Est = nRow0;.   
e230: 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
e240: 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  t;.    WHERETRAC
e250: 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20  E(0x10,("IN row 
e260: 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64  estimate: est=%d
e270: 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
e280: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
e290: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e2a0: 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a  d==nRecValid );.
e2b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
e2c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e2d0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
e2e0: 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65  STAT4 */...#ifde
e2f0: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
e300: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
e310: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
e320: 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  a WhereTerm obje
e330: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
e340: 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74  d whereTermPrint
e350: 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72  (WhereTerm *pTer
e360: 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20  m, int iTerm){. 
e370: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
e380: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
e390: 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d  gPrintf("TERM-%-
e3a0: 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72  3d NULL\n", iTer
e3b0: 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
e3c0: 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a   char zType[4];.
e3d0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
e3e0: 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20  , "...", 4);.   
e3f0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
e400: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
e410: 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20  AL ) zType[0] = 
e420: 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65  'V';.    if( pTe
e430: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
e440: 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70  WO_EQUIV  ) zTyp
e450: 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20  e[1] = 'E';.    
e460: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
e470: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
e480: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
e490: 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b   zType[2] = 'L';
e4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
e4b0: 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
e4c0: 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73  "TERM-%-3d %p %s
e4d0: 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72 6f   cursor=%-3d pro
e4e0: 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78  b=%-3d op=0x%03x
e4f0: 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78 5c   wtFlags=0x%04x\
e500: 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  n",.       iTerm
e510: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
e520: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
e530: 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  r, pTerm->truthP
e540: 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65 72  rob,.       pTer
e550: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70 54  m->eOperator, pT
e560: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20  erm->wtFlags);. 
e570: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
e580: 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d  ewExpr(0, pTerm-
e590: 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a  >pExpr, 0);.  }.
e5a0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
e5b0: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
e5c0: 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
e5d0: 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
e5e0: 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
e5f0: 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
e600: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
e610: 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
e620: 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
e630: 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
e640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
e650: 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
e660: 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
e670: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
e680: 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20  +7)/8;.  struct 
e690: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
e6a0: 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
e6b0: 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
e6c0: 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
e6d0: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
e6e0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
e6f0: 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30  Printf("%c%2d.%0
e700: 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
e710: 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
e720: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
e730: 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
e740: 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
e750: 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
e760: 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
e770: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
e780: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
e790: 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
e7a0: 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
e7b0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
e7c0: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
e7d0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
e7e0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
e7f0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
e800: 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
e810: 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
e820: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
e830: 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
e840: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
e850: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
e860: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
e870: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
e880: 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
e890: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
e8a0: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
e8b0: 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
e8c0: 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
e8d0: 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
e8e0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e8f0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
e900: 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
e910: 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
e920: 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
e930: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
e940: 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
e950: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
e960: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
e970: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
e980: 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
e990: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
e9a0: 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
e9b0: 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
e9c0: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
e9d0: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
e9e0: 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
e9f0: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
ea00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ea10: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
ea20: 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
ea30: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
ea40: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
ea50: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
ea60: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
ea70: 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
ea80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ea90: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
eaa0: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
eab0: 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
eac0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
ead0: 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
eae0: 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
eaf0: 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
eb00: 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
eb10: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
eb20: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
eb30: 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
eb40: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
eb50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
eb60: 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
eb70: 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
eb80: 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
eb90: 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
eba0: 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
ebb0: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
ebc0: 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
ebd0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ebe0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ebf0: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
ec00: 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
ec10: 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
ec20: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
ec30: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
ec40: 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
ec50: 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
ec60: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
ec70: 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
ec80: 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
ec90: 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
eca0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
ecb0: 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
ecc0: 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
ecd0: 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
ece0: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
ecf0: 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
ed00: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
ed10: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
ed20: 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
ed30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
ed40: 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
ed50: 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
ed60: 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
ed70: 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
ed80: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
ed90: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
eda0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
edb0: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
edc0: 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
edd0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
ede0: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
edf0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
ee00: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
ee10: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
ee20: 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
ee30: 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
ee40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
ee50: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
ee60: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
ee70: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
ee80: 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
ee90: 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
eea0: 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
eeb0: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
eec0: 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
eed0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
eee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
eef0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ef00: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
ef10: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
ef20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ef30: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
ef40: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
ef50: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
ef60: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
ef70: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
ef80: 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
ef90: 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
efa0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
efb0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
efc0: 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
efd0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
efe0: 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
eff0: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
f000: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
f010: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
f020: 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
f030: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
f040: 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
f050: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
f060: 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
f070: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
f080: 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
f090: 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
f0a0: 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
f0b0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
f0c0: 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
f0d0: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
f0e0: 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
f0f0: 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
f100: 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
f110: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f120: 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
f130: 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
f140: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
f150: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  (db, sizeof(p->a
f160: 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20  LTerm[0])*n);.  
f170: 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72  if( paNew==0 ) r
f180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
f190: 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  EM;.  memcpy(paN
f1a0: 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
f1b0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
f1c0: 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
f1d0: 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
f1e0: 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
f1f0: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
f200: 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
f210: 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61    p->aLTerm = pa
f220: 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  New;.  p->nLSlot
f230: 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53   = n;.  return S
f240: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f250: 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74  ** Transfer cont
f260: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ent from the sec
f270: 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74  ond pLoop into t
f280: 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  he first..*/.sta
f290: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
f2a0: 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64  pXfer(sqlite3 *d
f2b0: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  b, WhereLoop *pT
f2c0: 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46  o, WhereLoop *pF
f2d0: 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f  rom){.  whereLoo
f2e0: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
f2f0: 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72  pTo);.  if( wher
f300: 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
f310: 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65  pTo, pFrom->nLTe
f320: 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  rm) ){.    memse
f330: 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69  t(&pTo->u, 0, si
f340: 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20  zeof(pTo->u));. 
f350: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f360: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
f370: 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
f380: 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52   WHERE_LOOP_XFER
f390: 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _SZ);.  memcpy(p
f3a0: 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f  To->aLTerm, pFro
f3b0: 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e  m->aLTerm, pTo->
f3c0: 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54  nLTerm*sizeof(pT
f3d0: 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a  o->aLTerm[0]));.
f3e0: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
f3f0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
f400: 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
f410: 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
f420: 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
f430: 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
f440: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
f450: 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
f460: 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
f470: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
f480: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f490: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f4a0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
f4b0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
f4c0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f4d0: 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
f4e0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f4f0: 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
f500: 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
f510: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f520: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
f530: 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
f540: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
f550: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f560: 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
f570: 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
f580: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
f590: 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
f5a0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f5b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49    for(i=0; i<pWI
f5c0: 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
f5d0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 65  ){.      WhereLe
f5e0: 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70  vel *pLevel = &p
f5f0: 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
f600: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
f610: 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65 6c  WLoop && (pLevel
f620: 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
f630: 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
f640: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  E) ){.        sq
f650: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f660: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
f670: 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Loop);.      }. 
f680: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f690: 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  WhereClauseClear
f6a0: 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a  (&pWInfo->sWC);.
f6b0: 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
f6c0: 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20  o->pLoops ){.   
f6d0: 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20     WhereLoop *p 
f6e0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  = pWInfo->pLoops
f6f0: 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
f700: 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78  pLoops = p->pNex
f710: 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65  tLoop;.      whe
f720: 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
f730: 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   p);.    }.    s
f740: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f750: 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a   pWInfo);.  }.}.
f760: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
f770: 55 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  UE if all of the
f780: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
f790: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
f7a0: 20 20 58 20 68 61 73 20 74 68 65 20 73 61 6d 65    X has the same
f7b0: 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
f7c0: 68 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20  hat Y.**   (2)  
f7d0: 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
f7e0: 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28  bset of Y.**   (
f7f0: 33 29 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c  3)  X skips at l
f800: 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c  east as many col
f810: 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20  umns as Y.**.** 
f820: 42 79 20 22 70 72 6f 70 65 72 20 73 75 62 73 65  By "proper subse
f830: 74 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20  t" we mean that 
f840: 58 20 75 73 65 73 20 66 65 77 65 72 20 57 48 45  X uses fewer WHE
f850: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a  RE clause terms.
f860: 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ** than Y and th
f870: 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
f880: 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
f890: 62 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65  by X is also use
f8a0: 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a  d.** by Y..**.**
f8b0: 20 49 66 20 58 20 69 73 20 61 20 70 72 6f 70 65   If X is a prope
f8c0: 72 20 73 75 62 73 65 74 20 6f 66 20 59 20 74 68  r subset of Y th
f8d0: 65 6e 20 59 20 69 73 20 61 20 62 65 74 74 65 72  en Y is a better
f8e0: 20 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68   choice and ough
f8f0: 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c  t.** to have a l
f900: 6f 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73  ower cost.  This
f910: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
f920: 20 54 52 55 45 20 77 68 65 6e 20 74 68 61 74 20   TRUE when that 
f930: 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f  cost .** relatio
f940: 6e 73 68 69 70 20 69 73 20 69 6e 76 65 72 74 65  nship is inverte
f950: 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  d and needs to b
f960: 65 20 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65  e adjusted.  The
f970: 20 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77   third rule.** w
f980: 61 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65  as added because
f990: 20 69 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d   if X uses skip-
f9a0: 73 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59  scan less than Y
f9b0: 20 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a   it still might.
f9c0: 2a 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77  ** deserve a low
f9d0: 65 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20  er cost even if 
f9e0: 69 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  it is a proper s
f9f0: 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73  ubset of Y..*/.s
fa00: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
fa10: 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
fa20: 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20  Subset(.  const 
fa30: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20  WhereLoop *pX,  
fa40: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68       /* First Wh
fa50: 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61  ereLoop to compa
fa60: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68  re */.  const Wh
fa70: 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20  ereLoop *pY     
fa80: 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67     /* Compare ag
fa90: 61 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65  ainst this Where
faa0: 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Loop */.){.  int
fab0: 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d   i, j;.  if( pX-
fac0: 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69  >nLTerm-pX->nSki
fad0: 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d  p >= pY->nLTerm-
fae0: 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  pY->nSkip ){.   
faf0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20   return 0; /* X 
fb00: 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20  is not a subset 
fb10: 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  of Y */.  }.  if
fb20: 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58  ( pY->nSkip > pX
fb30: 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e  ->nSkip ) return
fb40: 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52   0;.  if( pX->rR
fb50: 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29  un >= pY->rRun )
fb60: 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52  {.    if( pX->rR
fb70: 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20  un > pY->rRun ) 
fb80: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
fb90: 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  X costs more tha
fba0: 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  n Y */.    if( p
fbb0: 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f  X->nOut > pY->nO
fbc0: 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ut ) return 0;  
fbd0: 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72    /* X costs mor
fbe0: 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a  e than Y */.  }.
fbf0: 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65    for(i=pX->nLTe
fc00: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
fc10: 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c  {.    if( pX->aL
fc20: 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Term[i]==0 ) con
fc30: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
fc40: 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  =pY->nLTerm-1; j
fc50: 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
fc60: 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b   if( pY->aLTerm[
fc70: 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  j]==pX->aLTerm[i
fc80: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ] ) break;.    }
fc90: 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72  .    if( j<0 ) r
fca0: 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e  eturn 0;  /* X n
fcb0: 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
fcc0: 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d   since term X[i]
fcd0: 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a   not used by Y *
fce0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  /.  }.  return 1
fcf0: 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74  ;  /* All condit
fd00: 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a  ions meet */.}..
fd10: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a  /*.** Try to adj
fd20: 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ust the cost of 
fd30: 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c  WhereLoop pTempl
fd40: 61 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64  ate upwards or d
fd50: 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74  ownwards so.** t
fd60: 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  hat:.**.**   (1)
fd70: 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73   pTemplate costs
fd80: 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f   less than any o
fd90: 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  ther WhereLoops 
fda0: 74 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65  that are a prope
fdb0: 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65  r.**       subse
fdc0: 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a  t of pTemplate.*
fdd0: 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70  *.**   (2) pTemp
fde0: 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20  late costs more 
fdf0: 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
fe00: 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68  hereLoops for wh
fe10: 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a  ich pTemplate.**
fe20: 20 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70         is a prop
fe30: 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a  er subset..**.**
fe40: 20 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f   To say "WhereLo
fe50: 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  op X is a proper
fe60: 20 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65   subset of Y" me
fe70: 61 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20  ans that X uses 
fe80: 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63  fewer.** WHERE c
fe90: 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e  lause terms than
fea0: 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
feb0: 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
fec0: 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
fed0: 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79  .** also used by
fee0: 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   Y..*/.static vo
fef0: 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  id whereLoopAdju
ff00: 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65  stCost(const Whe
ff10: 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
ff20: 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
ff30: 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61  {.  if( (pTempla
ff40: 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
ff50: 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
ff60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
ff70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
ff80: 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  oop){.    if( p-
ff90: 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
ffa0: 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75  ->iTab ) continu
ffb0: 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  e;.    if( (p->w
ffc0: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
ffd0: 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e  NDEXED)==0 ) con
ffe0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77  tinue;.    if( w
fff0: 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
10000 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70  roperSubset(p, p
10010 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20  Template) ){.   
10020 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
10030 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e  mplate cost down
10040 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20  ward so that it 
10050 69 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20  is cheaper than 
10060 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75  its .      ** su
10070 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20  bset p. */.     
10080 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
10090 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
100a0 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
100b0 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
100e0 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
100f0 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
10100 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20  ->nOut-1));.    
10110 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
10120 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
10130 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
10140 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31  ut = p->nOut - 1
10150 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10160 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
10170 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65  ProperSubset(pTe
10180 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20  mplate, p) ){.  
10190 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54      /* Adjust pT
101a0 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77  emplate cost upw
101b0 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
101c0 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20  s costlier than 
101d0 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a  p since.      **
101e0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20   pTemplate is a 
101f0 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
10200 20 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52   p */.      WHER
10210 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75  ETRACE(0x80,("su
10220 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74  bset cost adjust
10230 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64  ment %d,%d to %d
10240 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ,%d\n",.        
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10260 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20  Template->rRun, 
10270 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c  pTemplate->nOut,
10280 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
10290 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65  t+1));.      pTe
102a0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
102b0 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
102c0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
102d0 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20  p->nOut + 1;.   
102e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
102f0 53 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  Search the list 
10300 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e  of WhereLoops in
10310 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67   *ppPrev looking
10320 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61   for one that ca
10330 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74  n be.** supplant
10340 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e  ed by pTemplate.
10350 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  .**.** Return NU
10360 4c 4c 20 69 66 20 74 68 65 20 57 68 65 72 65 4c  LL if the WhereL
10370 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  oop list contain
10380 73 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  s an entry that 
10390 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20  can supplant.** 
103a0 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74  pTemplate, in ot
103b0 68 65 72 20 77 6f 72 64 73 20 69 66 20 70 54 65  her words if pTe
103c0 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20  mplate does not 
103d0 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69  belong on the li
103e0 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20  st..**.** If pX 
103f0 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74  is a WhereLoop t
10400 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61  hat pTemplate ca
10410 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e  n supplant, then
10420 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c   return the.** l
10430 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20  ink that points 
10440 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  to pX..**.** If 
10450 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74  pTemplate cannot
10460 20 73 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78   supplant any ex
10470 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  isting element o
10480 66 20 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e  f the list but n
10490 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64  eeds.** to be ad
104a0 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c  ded to the list,
104b0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
104c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61  ointer to the ta
104d0 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  il of the list..
104e0 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c  */.static WhereL
104f0 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46  oop **whereLoopF
10500 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65  indLesser(.  Whe
10510 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
10520 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
10530 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b  op *pTemplate.){
10540 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b  .  WhereLoop *p;
10550 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65  .  for(p=(*ppPre
10560 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  v); p; ppPrev=&p
10570 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
10580 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
10590 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
105a0 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e  ate->iTab || p->
105b0 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c  iSortIdx!=pTempl
105c0 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b  ate->iSortIdx ){
105d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74  .      /* If eit
105e0 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20  her the iTab or 
105f0 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20  iSortIdx values 
10600 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f  for two WhereLoo
10610 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a  p are different.
10620 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
10630 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ose WhereLoops n
10640 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
10650 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  ered separately.
10660 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20    Neither is.   
10670 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74     ** a candidat
10680 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
10690 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20   other. */.     
106a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
106b0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63  .    /* In the c
106c0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
106d0 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75  ation, the rSetu
106e0 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  p value is eithe
106f0 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72  r zero.    ** or
10700 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69   the cost of bui
10710 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
10720 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29  ic index (NlogN)
10730 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20   and the NlogN. 
10740 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
10750 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65  e for compatible
10760 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a   WhereLoops. */.
10770 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
10780 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d  Setup==0 || pTem
10790 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30  plate->rSetup==0
107a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
107b0 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d     || p->rSetup=
107c0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
107d0 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68  up );..    /* wh
107e0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
107f0 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  ) always generat
10800 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74  es and inserts t
10810 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
10820 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66  ex.    ** case f
10830 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d  irst.  Hence com
10840 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74  patible candidat
10850 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76  e WhereLoops nev
10860 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72  er have a larger
10870 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20  .    ** rSetup. 
10880 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d  Call this SETUP-
10890 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20  INVARIANT */.   
108a0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
108b0 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
108c0 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
108d0 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20   Any loop using 
108e0 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65  an appliation-de
108f0 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20  fined index (or 
10900 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20  PRIMARY KEY or. 
10910 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e     ** UNIQUE con
10920 73 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e  straint) with on
10930 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e  e or more == con
10940 73 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74  straints is bett
10950 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61  er.    ** than a
10960 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
10970 78 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  x. Unless it is 
10980 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a  a skip-scan. */.
10990 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
109a0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
109b0 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20  _INDEX)!=0.     
109c0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  && (pTemplate->n
109d0 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26  Skip)==0.     &&
109e0 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
109f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
10a00 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26  EXED)!=0.     &&
10a10 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
10a20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
10a30 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20  UMN_EQ)!=0.     
10a40 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  && (p->prereq & 
10a50 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
10a60 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
10a70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20  rereq.    ){.   
10a80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10a90 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74  .    /* If exist
10aa0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20  ing WhereLoop p 
10ab0 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  is better than p
10ac0 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c  Template, pTempl
10ad0 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ate can be.    *
10ae0 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68  * discarded.  Wh
10af0 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
10b00 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  ter if:.    **  
10b10 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d   (1)  p has no m
10b20 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ore dependencies
10b30 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
10b40 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
10b50 29 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61  )  p has an equa
10b60 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  l or lower cost 
10b70 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20  than pTemplate. 
10b80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
10b90 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
10ba0 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
10bb0 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28  ->prereq    /* (
10bc0 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  1)  */.     && p
10bd0 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c  ->rSetup<=pTempl
10be0 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20  ate->rSetup     
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c00 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2a) */.     && 
10c10 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61  p->rRun<=pTempla
10c20 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20  te->rRun        
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c40 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2b) */.     &&
10c50 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c   p->nOut<=pTempl
10c60 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c80 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b  * (2c) */.    ){
10c90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10ca0 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65    /* Discard pTe
10cb0 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
10cc0 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70  .    /* If pTemp
10cd0 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62  late is always b
10ce0 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68  etter than p, th
10cf0 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65  en cause p to be
10d00 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20   overwritten.   
10d10 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
10d20 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  te.  pTemplate i
10d30 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20  s better than p 
10d40 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
10d50 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
10d60 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
10d70 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a  ces than p, and.
10d80 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54      **   (2)  pT
10d90 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65  emplate has an e
10da0 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
10db0 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a  st than p..    *
10dc0 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
10dd0 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
10de0 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
10df0 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f  late->prereq   /
10e00 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
10e10 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70  & p->rRun>=pTemp
10e20 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
10e50 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
10e60 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t>=pTemplate->nO
10e70 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e90 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b  * (2b) */.    ){
10ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10eb0 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
10ec0 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f  ate->rSetup ); /
10ed0 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  * SETUP-INVARIAN
10ee0 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20  T above */.     
10ef0 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75   break;   /* Cau
10f00 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
10f10 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c  ritten by pTempl
10f20 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ate */.    }.  }
10f30 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76  .  return ppPrev
10f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
10f50 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57  t or replace a W
10f60 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75  hereLoop entry u
10f70 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  sing the templat
10f80 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a  e supplied..**.*
10f90 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68  * An existing Wh
10fa0 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69  ereLoop entry mi
10fb0 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  ght be overwritt
10fc0 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65  en if the new te
10fd0 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74  mplate.** is bet
10fe0 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65  ter and has fewe
10ff0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  r dependencies. 
11000 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65   Or the template
11010 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
11020 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72  .** and no inser
11030 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20  t will occur if 
11040 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
11050 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20  eLoop is faster 
11060 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72  and has.** fewer
11070 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
11080 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  an the template.
11090 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65    Otherwise a ne
110a0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a  w WhereLoop is.*
110b0 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e  * added based on
110c0 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a   the template..*
110d0 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72  *.** If pBuilder
110e0 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20  ->pOrSet is not 
110f0 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72  NULL then we car
11100 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65  e about only the
11110 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65  .** prerequisite
11120 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e  s and rRun and n
11130 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65  Out costs of the
11140 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20   N best loops.  
11150 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  That.** informat
11160 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20  ion is gathered 
11170 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d  in the pBuilder-
11180 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20  >pOrSet object. 
11190 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a   This special.**
111a0 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65   processing mode
111b0 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f   is used only fo
111c0 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
111d0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  essing..**.** Wh
111e0 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  en accumulating 
111f0 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28  multiple loops (
11200 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70  when pBuilder->p
11210 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77  OrSet is NULL) w
11220 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74  e.** still might
11230 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c   overwrite simil
11240 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68  ar loops with th
11250 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  e new template i
11260 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d  f the.** new tem
11270 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e  plate is better.
11280 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f    Loops may be o
11290 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
112a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  e following .** 
112b0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d  conditions are m
112c0 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  et:.**.**    (1)
112d0 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
112e0 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20  same iTab..**   
112f0 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20   (2)  They have 
11300 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64  the same iSortId
11310 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68  x..**    (3)  Th
11320 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73  e template has s
11330 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70  ame or fewer dep
11340 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
11350 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
11360 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74  **    (4)  The t
11370 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20  emplate has the 
11380 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
11390 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  st than the curr
113a0 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74  ent loop.*/.stat
113b0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
113c0 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70  Insert(WhereLoop
113d0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
113e0 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  r, WhereLoop *pT
113f0 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72  emplate){.  Wher
11400 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20  eLoop **ppPrev, 
11410 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  *p;.  WhereInfo 
11420 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
11430 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71  er->pWInfo;.  sq
11440 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
11450 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
11460 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65  .  /* If pBuilde
11470 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66  r->pOrSet is def
11480 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ined, then only 
11490 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  keep track of th
114a0 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64  e costs.  ** and
114b0 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20   prereqs..  */. 
114c0 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70   if( pBuilder->p
114d0 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20 20  OrSet!=0 ){.    
114e0 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  if( pTemplate->n
114f0 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48 45  LTerm ){.#if WHE
11500 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
11510 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42        u16 n = pB
11520 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
11530 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  n;.      int x =
11540 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68  .#endif.      wh
11550 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69  ereOrInsert(pBui
11560 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54  lder->pOrSet, pT
11570 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c  emplate->prereq,
11580 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
11590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
115c0 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52  >nOut);.#if WHER
115d0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
115e0 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69  * 0x8 */.      i
115f0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
11600 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
11610 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
11620 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f  ugPrintf(x?"   o
11630 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d  r-%d:  ":"   or-
11640 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20  X:  ", n);.     
11650 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11660 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
11670 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
11680 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11690 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
116a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
116b0 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78  * Look for an ex
116c0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
116d0 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68   to replace with
116e0 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a   pTemplate.  */.
116f0 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73    whereLoopAdjus
11700 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c  tCost(pWInfo->pL
11710 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29  oops, pTemplate)
11720 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65  ;.  ppPrev = whe
11730 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
11740 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  (&pWInfo->pLoops
11750 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20  , pTemplate);.. 
11760 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29   if( ppPrev==0 )
11770 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
11780 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
11790 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65  WhereLoop on the
117a0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65   list that is be
117b0 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  tter.    ** than
117c0 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a   pTemplate, so j
117d0 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70  ust ignore pTemp
117e0 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52  late */.#if WHER
117f0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
11800 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28  * 0x8 */.    if(
11810 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
11820 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
11830 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
11840 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22  intf("   skip: "
11850 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
11860 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
11870 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
11880 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
11890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
118a0 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b  E_OK;  .  }else{
118b0 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76  .    p = *ppPrev
118c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
118d0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
118e0 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
118f0 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
11900 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
11910 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
11920 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
11930 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
11940 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
11950 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
11960 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
11970 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
11980 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
11990 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69  ED /* 0x8 */.  i
119a0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
119b0 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
119c0 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
119d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
119e0 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a  Printf("replace:
119f0 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
11a00 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75  LoopPrint(p, pBu
11a10 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
11a20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
11a30 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61  bugPrintf("    a
11a40 64 64 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72  dd: ");.    wher
11a50 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
11a60 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
11a70 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
11a80 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
11a90 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
11aa0 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74   new WhereLoop t
11ab0 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64  o add to the end
11ac0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   of the list */.
11ad0 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20      *ppPrev = p 
11ae0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11af0 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
11b00 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20  WhereLoop));.   
11b10 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
11b20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11b30 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  .    whereLoopIn
11b40 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e  it(p);.    p->pN
11b50 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d  extLoop = 0;.  }
11b60 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20  else{.    /* We 
11b70 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
11b80 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b  ing WhereLoop p[
11b90 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20 77  ].  But before w
11ba0 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20  e do, first.    
11bb0 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  ** go through th
11bc0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69  e rest of the li
11bd0 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e  st and delete an
11be0 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20  y other entries 
11bf0 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70  besides.    ** p
11c00 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  [] that are also
11c10 20 73 75 70 70 6c 61 74 65 64 20 62 79 20 70 54   supplated by pT
11c20 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57  emplate */.    W
11c30 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69  hereLoop **ppTai
11c40 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  l = &p->pNextLoo
11c50 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  p;.    WhereLoop
11c60 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68   *pToDel;.    wh
11c70 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a  ile( *ppTail ){.
11c80 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77        ppTail = w
11c90 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
11ca0 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70  er(ppTail, pTemp
11cb0 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  late);.      if(
11cc0 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65   ppTail==0 ) bre
11cd0 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c  ak;.      pToDel
11ce0 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20   = *ppTail;.    
11cf0 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20    if( pToDel==0 
11d00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a  ) break;.      *
11d10 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d  ppTail = pToDel-
11d20 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20  >pNextLoop;.#if 
11d30 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
11d40 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
11d50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
11d60 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
11d70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11d80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 64  3DebugPrintf(" d
11d90 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20  elete: ");.     
11da0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11db0 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64  t(pToDel, pBuild
11dc0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
11dd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  }.#endif.      w
11de0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
11df0 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20  b, pToDel);.    
11e00 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  }.  }.  whereLoo
11e10 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
11e20 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28  mplate);.  if( (
11e30 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
11e40 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
11e50 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
11e60 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
11e70 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
11e80 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
11e90 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
11ea0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
11eb0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
11ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11ee0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
11ef0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
11f00 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
11f10 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
11f20 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
11f30 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
11f40 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
11f50 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
11f60 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
11f70 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20  .** index..*.** 
11f80 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20  For every WHERE 
11f90 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
11fa0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
11fb0 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  the index.** and
11fc0 20 77 68 69 63 68 20 68 61 73 20 61 20 74 72 75   which has a tru
11fd0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
11fe0 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f  ssigned by one o
11ff0 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64  f the likelihood
12000 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c  (),.** likely(),
12010 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53   or unlikely() S
12020 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65  QL functions, re
12030 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74  duce the estimat
12040 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  ed number.** of 
12050 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 74  output rows by t
12060 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73  he probability s
12070 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
12080 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65  TUNING:  For eve
12090 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
120a0 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74  term that is not
120b0 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64   used by the ind
120c0 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20  ex.** and which 
120d0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
120e0 20 61 73 73 69 67 6e 65 64 20 74 72 75 74 68 20   assigned truth 
120f0 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75  probability, heu
12100 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72  ristics.** descr
12110 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75  ibed below are u
12120 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73  sed to try to es
12130 74 69 6d 61 74 65 20 74 68 65 20 74 72 75 74 68  timate the truth
12140 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a   probability..**
12150 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70   TODO --> Perhap
12160 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68  s this is someth
12170 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62  ing that could b
12180 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65  e improved by be
12190 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74  tter.** table st
121a0 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20  atistics..**.** 
121b0 48 65 75 72 69 73 74 69 63 20 31 3a 20 20 45 73  Heuristic 1:  Es
121c0 74 69 6d 61 74 65 20 74 68 65 20 74 72 75 74 68  timate the truth
121d0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20   probability as 
121e0 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e  93.75%.  The 93.
121f0 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72  75%.** value cor
12200 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69  responds to -1 i
12210 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f  n LogEst notatio
12220 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73  n, so this means
12230 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68   decrement.** th
12240 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
12250 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79   field for every
12260 20 73 75 63 68 20 57 48 45 52 45 20 63 6c 61 75   such WHERE clau
12270 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48  se term..**.** H
12280 65 75 72 69 73 74 69 63 20 32 3a 20 20 49 66 20  euristic 2:  If 
12290 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
122a0 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
122b0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
122c0 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45  he.** form "x==E
122d0 58 50 52 22 20 61 6e 64 20 45 58 50 52 20 69 73  XPR" and EXPR is
122e0 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20   not a constant 
122f0 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b  0 or 1, then mak
12300 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69  e sure the.** fi
12310 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65  nal output row e
12320 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72  stimate is no gr
12330 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f  eater than 1/4 o
12340 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  f the total numb
12350 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e  er.** of rows in
12360 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20   the table.  In 
12370 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73  other words, ass
12380 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52  ume that x==EXPR
12390 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20   will filter.** 
123a0 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f  out at least 3 o
123b0 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49  ut of 4 rows.  I
123c0 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20  f EXPR is -1 or 
123d0 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79  0 or 1, then may
123e0 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f  be the.** "x" co
123f0 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20  lumn is boolean 
12400 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20  or else -1 or 0 
12410 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e  or 1 is a common
12420 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a   default value.*
12430 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c  * on the "x" col
12440 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68  umn and so in th
12450 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70  at case only cap
12460 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
12470 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31  estimate.** at 1
12480 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f  /2 instead of 1/
12490 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  4..*/.static voi
124a0 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
124b0 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65  tAdjust(.  Where
124c0 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
124d0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
124e0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
124f0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
12500 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f    /* The loop to
12510 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64   adjust downward
12520 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f   */.  LogEst nRo
12530 77 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w            /* 
12540 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
12550 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  n the entire tab
12560 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
12570 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58  Term *pTerm, *pX
12580 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41  ;.  Bitmask notA
12590 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70  llowed = ~(pLoop
125a0 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e  ->prereq|pLoop->
125b0 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74  maskSelf);.  int
125c0 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45   i, j, k;.  LogE
125d0 73 74 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20  st iReduce = 0; 
125e0 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75     /* pLoop->nOu
125f0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63  t should not exc
12600 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65  eed nRow-iReduce
12610 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
12620 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
12630 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
12640 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  X)==0 );.  for(i
12650 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65  =pWC->nTerm, pTe
12660 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20  rm=pWC->a; i>0; 
12670 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i--, pTerm++){. 
12680 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
12690 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
126a0 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61  RTUAL)!=0 ) brea
126b0 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  k;.    if( (pTer
126c0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
126d0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d  Loop->maskSelf)=
126e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
126f0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
12700 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c  rereqAll & notAl
12710 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74  lowed)!=0 ) cont
12720 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
12730 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  pLoop->nLTerm-1;
12740 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
12750 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61     pX = pLoop->a
12760 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  LTerm[j];.      
12770 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74  if( pX==0 ) cont
12780 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
12790 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  pX==pTerm ) brea
127a0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  k;.      if( pX-
127b0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28  >iParent>=0 && (
127c0 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72  &pWC->a[pX->iPar
127d0 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62  ent])==pTerm ) b
127e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
127f0 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
12800 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
12810 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
12820 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74      /* If a trut
12830 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73  h probability is
12840 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67   specified using
12850 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28   the likelihood(
12860 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20  ) hints,.       
12870 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65   ** then use the
12880 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f   probability pro
12890 76 69 64 65 64 20 62 79 20 74 68 65 20 61 70 70  vided by the app
128a0 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  lication. */.   
128b0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
128c0 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
128d0 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Prob;.      }els
128e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  e{.        /* In
128f0 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
12900 65 78 70 6c 69 63 69 74 20 74 72 75 74 68 20 70  explicit truth p
12910 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73  robabilities, us
12920 65 20 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a  e heuristics to.
12930 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73          ** guess
12940 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72   a reasonable tr
12950 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
12960 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
12970 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20  p->nOut--;.     
12980 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
12990 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57  perator&(WO_EQ|W
129a0 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20  O_IS) ){.       
129b0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
129c0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
129d0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
129e0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
129f0 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
12a00 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
12a10 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12a20 49 73 49 6e 74 65 67 65 72 28 70 52 69 67 68 74  IsInteger(pRight
12a30 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29  , &k) && k>=(-1)
12a40 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20   && k<=1 ){.    
12a50 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a          k = 10;.
12a60 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
12a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
12a80 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   20;.          }
12a90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
12aa0 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75  Reduce<k ) iRedu
12ab0 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  ce = k;.        
12ac0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12ad0 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
12ae0 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65  >nOut > nRow-iRe
12af0 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e  duce )  pLoop->n
12b00 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65  Out = nRow - iRe
12b10 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  duce;.}../*.** A
12b20 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43  djust the cost C
12b30 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74   by the costMult
12b40 20 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73   facter T.  This
12b50 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a   only occurs if.
12b60 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  ** compiled with
12b70 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
12b80 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66  _COSTMULT.*/.#if
12b90 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12ba0 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66  E_COSTMULT.# def
12bb0 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
12bc0 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20  tiplier(C,T)  C 
12bd0 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66  += T.#else.# def
12be0 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
12bf0 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e  tiplier(C,T).#en
12c00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  dif../*.** We ha
12c10 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
12c20 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
12c30 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
12c40 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  rms of the .** i
12c50 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79  ndex pIndex. Try
12c60 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
12c70 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  re..**.** When t
12c80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12c90 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72  called, pBuilder
12ca0 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e  ->pNew->nOut con
12cb0 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75  tains the .** nu
12cc0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
12cd0 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  ected to be visi
12ce0 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67  ted by filtering
12cf0 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a   using the nEq .
12d00 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49  ** terms only. I
12d10 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64  f it is modified
12d20 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  , this value is 
12d30 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20  restored before 
12d40 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
12d50 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
12d60 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d   If pProbe->tnum
12d70 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
12d80 70 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65  pIndex is a fake
12d90 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20   index used for 
12da0 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
12db0 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73  RIMARY KEY..*/.s
12dc0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
12dd0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
12de0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
12df0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
12e00 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
12e10 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a  Loop factory */.
12e20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
12e30 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
12e40 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
12e50 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
12e60 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  yzed */.  Index 
12e70 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20  *pProbe,        
12e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
12e90 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f  index on pSrc */
12ea0 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c  .  LogEst nInMul
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72     /* log(Number
12ed0 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64   of iterations d
12ee0 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a  ue to IN) */.){.
12ef0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
12f00 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
12f10 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52  pWInfo;  /* WHER
12f20 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78  E analyse contex
12f30 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
12f40 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
12f50 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a  Parse;        /*
12f60 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12f70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12f80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
12f90 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12fa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c  e connection mal
12fb0 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  loc context */. 
12fc0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
12fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12fe0 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
12ff0 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e  reLoop under con
13000 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
13010 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13030 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e  * A WhereTerm un
13040 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  der consideratio
13050 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73  n */.  int opMas
13060 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
13070 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
13080 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f  operators for co
13090 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57  nstraints */.  W
130a0 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20  hereScan scan;  
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
130c0 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57  * Iterator for W
130d0 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20  HERE terms */.  
130e0 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72  Bitmask saved_pr
130f0 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  ereq;           
13100 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
13110 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65  e of pNew->prere
13120 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
13130 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20  _nLTerm;        
13140 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
13150 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
13160 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31  ->nLTerm */.  u1
13170 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20  6 saved_nEq;    
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13190 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
131a0 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
131b0 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  .nEq */.  u16 sa
131c0 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20  ved_nSkip;      
131d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
131e0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
131f0 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20  New->nSkip */.  
13200 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
13210 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
13220 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
13230 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
13240 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
13250 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
13260 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13270 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13280 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
13290 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
132b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
132c0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
132f0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
13300 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
13310 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
13320 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
13330 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
13340 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
13350 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
13360 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
13370 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
13380 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
13390 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
133a0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
133b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
133c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
133d0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
133e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
133f0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
13400 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
13410 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13420 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
13430 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
13440 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
13450 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
13460 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
13470 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
13480 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70 50 72   }else if( /*pPr
13490 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 2a  obe->tnum<=0 ||*
134a0 2f 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e  / (pSrc->fg.join
134b0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
134c0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 ){.    opMask
134d0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
134e0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
134f0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
13500 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
13510 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c  _EQ|WO_IN|WO_GT|
13520 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
13530 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  E|WO_ISNULL|WO_I
13540 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  S;.  }.  if( pPr
13550 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
13560 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
13570 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
13580 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72  WO_LE);..  asser
13590 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
135a0 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
135b0 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64  lumn );..  saved
135c0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
135d0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
135e0 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e  d_nSkip = pNew->
135f0 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e  nSkip;.  saved_n
13600 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
13610 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
13620 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
13630 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
13640 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
13650 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
13660 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
13670 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
13680 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
13690 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
136a0 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61  Src->iCursor, sa
136b0 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20  ved_nEq,.       
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
136e0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
136f0 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20   = 0;.  rSize = 
13700 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
13710 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69  Est[0];.  rLogSi
13720 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a  ze = estLog(rSiz
13730 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d  e);.  for(; rc==
13740 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
13750 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77  rm!=0; pTerm = w
13760 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
13770 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f  an)){.    u16 eO
13780 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  p = pTerm->eOper
13790 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74  ator;   /* Short
137a0 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e  hand for pTerm->
137b0 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
137c0 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78   LogEst rCostIdx
137d0 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75  ;.    LogEst nOu
137e0 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20  tUnadjusted;    
137f0 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f      /* nOut befo
13800 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52  re IN() and WHER
13810 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f  E adjustments */
13820 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  .    int nIn = 0
13830 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13840 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
13850 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52  STAT4.    int nR
13860 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
13870 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23  er->nRecValid;.#
13880 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65  endif.    if( (e
13890 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  Op==WO_ISNULL ||
138a0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
138b0 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
138c0 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78 43 6f  .     && indexCo
138d0 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f  lumnNotNull(pPro
138e0 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a 20  be, saved_nEq). 
138f0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74     ){.      cont
13900 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20  inue; /* ignore 
13910 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f  IS [NOT] NULL co
13920 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54  nstraints on NOT
13930 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
13940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13950 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
13960 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
13970 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  lf ) continue;..
13980 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
13990 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20 62 6f  low the upper bo
139a0 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70  und of a LIKE op
139b0 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65  timization range
139c0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20   constraint.    
139d0 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61  ** to mix with a
139e0 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75   lower range bou
139f0 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68  nd from some oth
13a00 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20  er source */.   
13a10 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
13a20 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
13a30 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70  PT && pTerm->eOp
13a40 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20  erator==WO_LT ) 
13a50 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70  continue;..    p
13a60 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
13a70 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
13a80 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
13a90 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
13aa0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
13ab0 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
13ac0 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
13ad0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
13ae0 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
13af0 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
13b00 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  OOM */.    pNew-
13b10 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
13b20 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  Term++] = pTerm;
13b30 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
13b40 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65  q = (saved_prere
13b50 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
13b60 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d  qRight) & ~pNew-
13b70 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20  >maskSelf;..    
13b80 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d  assert( nInMul==
13b90 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e  0.        || (pN
13ba0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
13bb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
13bc0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
13bd0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
13be0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
13bf0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
13c00 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
13c10 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
13c20 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20  )!=0 .    );..  
13c30 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
13c40 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
13c50 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
13c60 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
13c70 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
13c80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
13c90 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
13ca0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13cb0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
13cc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
13cd0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
13ce0 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
13cf0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
13d00 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
13d10 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
13d20 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
13d30 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
13d40 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
13d50 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
13d60 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
13d70 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
13d80 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
13d90 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
13da0 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
13db0 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
13dc0 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
13dd0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
13de0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
13df0 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
13e00 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
13e10 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
13e20 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
13e50 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
13e60 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d  "x=?". */..    }
13e70 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
13e80 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
13e90 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
13ea0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
13eb0 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20  n[saved_nEq];.  
13ec0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13ed0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
13ee0 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65  N_EQ;.      asse
13ef0 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70  rt( saved_nEq==p
13f00 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13f10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
13f20 6f 6c 3d 3d 28 2d 31 29 20 7c 7c 20 28 69 43 6f  ol==(-1) || (iCo
13f30 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30  l>0 && nInMul==0
13f40 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70   && saved_nEq==p
13f50 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31  Probe->nKeyCol-1
13f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
13f70 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f   iCol>=0 && pPro
13f80 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d  be->uniqNotNull=
13f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13fa0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
13fb0 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45   WHERE_UNQ_WANTE
13fc0 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  D;.        }else
13fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
13fe0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
13ff0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
14000 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14010 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
14020 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
14030 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14040 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14050 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  N_NULL;.    }els
14060 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
14070 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20  GT|WO_GE) ){.   
14080 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
14090 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20   & WO_GT );.    
140a0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
140b0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20  & WO_GE );.     
140c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
140d0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
140e0 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c  ANGE|WHERE_BTM_L
140f0 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d  IMIT;.      pBtm
14100 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
14110 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTop = 0;.      
14120 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
14130 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
14140 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  T ){.        /* 
14150 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73  Range contraints
14160 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20   that come from 
14170 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
14180 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20  ation are.      
14190 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64    ** always used
141a0 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20   in pairs. */.  
141b0 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54        pTop = &pT
141c0 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  erm[1];.        
141d0 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70  assert( (pTop-(p
141e0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70  Term->pWC->a))<p
141f0 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d  Term->pWC->nTerm
14200 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
14210 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67  rt( pTop->wtFlag
14220 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
14230 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
14240 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61  rt( pTop->eOpera
14250 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20  tor==WO_LT );.  
14260 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
14270 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
14280 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
14290 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
142a0 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  OOM */.        p
142b0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
142c0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
142d0 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  op;.        pNew
142e0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
142f0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
14300 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
14310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
14320 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
14330 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  E) );.      test
14340 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
14350 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
14360 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45  ase( eOp & WO_LE
14370 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
14380 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14390 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
143a0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
143b0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
143c0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
143d0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
143e0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
143f0 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
14400 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
14410 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
14420 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
14430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
14440 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e  his point pNew->
14450 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
14460 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
14470 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20  s expected to.  
14480 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20    ** be visited 
14490 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  by the index sca
144a0 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65  n before conside
144b0 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c  ring term pTerm,
144c0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   or the.    ** v
144d0 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64  alues of nIn and
144e0 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65   nInMul. In othe
144f0 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e  r words, assumin
14500 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20  g that all .    
14510 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74  ** "x IN(...)" t
14520 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65  erms are replace
14530 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20  d with "x = ?". 
14540 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74  This block updat
14550 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  es.    ** the va
14560 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
14570 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  t to account for
14580 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20   pTerm (but not 
14590 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f  nIn/nInMul).  */
145a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
145b0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
145c0 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Out );.    if( p
145d0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
145e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
145f0 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
14600 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20  just nOut using 
14610 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61  stat3/stat4 data
14620 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69  . Or, if there i
14630 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34  s no stat3/stat4
14640 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20  .      ** data, 
14650 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72  using some other
14660 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20   estimate.  */. 
14670 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
14680 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
14690 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
146a0 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  Top, pNew);.    
146b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
146c0 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75   nEq = ++pNew->u
146d0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20  .btree.nEq;.    
146e0 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
146f0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
14700 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b  |WO_IN|WO_IS) );
14710 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
14720 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
14730 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  d_nOut );.      
14740 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
14750 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62  Prob<=0 && pProb
14760 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65  e->aiColumn[save
14770 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20  d_nEq]>=0 ){.   
14780 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65 4f       assert( (eO
14790 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49  p & WO_IN) || nI
147a0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
147b0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
147c0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20  WO_IN );.       
147d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70   pNew->nOut += p
147e0 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
147f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
14800 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
14810 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
14820 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14830 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
14840 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75       tRowcnt nOu
14850 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
14860 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20  f( nInMul==0 .  
14870 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
14880 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
14890 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
148a0 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65  tree.nEq<=pProbe
148b0 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20  ->nSampleCol.   
148c0 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20 26        && ((eOp &
148d0 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45   WO_IN)==0 || !E
148e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
148f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
14900 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20  xIsSelect)).    
14910 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
14920 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14930 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
14940 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20         if( (eOp 
14950 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
14960 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b  LL|WO_IS))!=0 ){
14970 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
14980 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14990 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EQ );.          
149a0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
149b0 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
149c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
149d0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
149e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
149f0 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
14a00 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
14a10 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
14a20 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a  pRight, &nOut);.
14a30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
14a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
14a50 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  = whereInScanEst
14a60 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14a70 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  r, pExpr->x.pLis
14a80 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
14a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14aa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14ab0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
14ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14ad0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14ae0 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20  ITE_OK ) break; 
14af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
14b00 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72   out of the pTer
14b10 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  m loop */.      
14b20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a      if( nOut ){.
14b30 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
14b40 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
14b50 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20  LogEst(nOut);.  
14b60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
14b70 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e  ew->nOut>saved_n
14b80 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out ) pNew->nOut
14b90 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
14ba0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
14bb0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
14bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14be0 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66  nOut==0 ).#endif
14bf0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
14c00 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
14c10 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  += (pProbe->aiRo
14c20 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70  wLogEst[nEq] - p
14c30 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
14c40 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20  st[nEq-1]);.    
14c50 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20        if( eOp & 
14c60 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
14c70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
14c80 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
14c90 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  no likelihood() 
14ca0 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68  value, assume th
14cb0 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  at a .          
14cc0 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c    ** "col IS NUL
14cd0 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  L" expression ma
14ce0 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d  tches twice as m
14cf0 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20  any rows .      
14d00 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c        ** as (col
14d10 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  =?). */.        
14d20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
14d30 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
14d40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14d50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
14d60 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74  * Set rCostIdx t
14d70 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  o the cost of vi
14d80 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20  siting selected 
14d90 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41  rows in index. A
14da0 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  dd.    ** it to 
14db0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63  pNew->rRun, whic
14dc0 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  h is currently s
14dd0 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  et to the cost o
14de0 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
14df0 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68  ** seek only. Th
14e00 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  en, if this is a
14e10 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
14e20 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73  dex, add the cos
14e30 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69  t of.    ** visi
14e40 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e  ting the rows in
14e50 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
14e60 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64    */.    rCostId
14e70 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  x = pNew->nOut +
14e80 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
14e90 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d  >szIdxRow)/pSrc-
14ea0 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  >pTab->szTabRow;
14eb0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
14ec0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
14ed0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f  dd(rLogSize, rCo
14ee0 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20  stIdx);.    if( 
14ef0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
14f00 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
14f10 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
14f20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  ){.      pNew->r
14f30 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
14f40 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
14f50 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20  n, pNew->nOut + 
14f60 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41  16);.    }.    A
14f70 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
14f80 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
14f90 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63  Probe->pTable->c
14fa0 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e  ostMult);..    n
14fb0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20  OutUnadjusted = 
14fc0 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  pNew->nOut;.    
14fd0 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49  pNew->rRun += nI
14fe0 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
14ff0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49  pNew->nOut += nI
15000 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
15010 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
15020 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e  djust(pBuilder->
15030 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
15040 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  );.    rc = wher
15050 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
15060 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  lder, pNew);..  
15070 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
15080 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
15090 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
150a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
150b0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d  aved_nOut;.    }
150c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
150d0 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61  ->nOut = nOutUna
150e0 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a  djusted;.    }..
150f0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
15100 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
15110 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
15120 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
15130 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  ee.nEq<pProbe->n
15140 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20  Column.    ){.  
15150 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
15160 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
15170 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
15180 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
15190 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
151a0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
151b0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
151c0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
151d0 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c  _STAT4.    pBuil
151e0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
151f0 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64   nRecValid;.#end
15200 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  if.  }.  pNew->p
15210 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72  rereq = saved_pr
15220 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ereq;.  pNew->u.
15230 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
15240 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 6e  d_nEq;.  pNew->n
15250 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
15260 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ip;.  pNew->wsFl
15270 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
15280 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  ags;.  pNew->nOu
15290 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
152a0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
152b0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a   saved_nLTerm;..
152c0 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73    /* Consider us
152d0 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20  ing a skip-scan 
152e0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
152f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
15300 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76  straints.  ** av
15310 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
15320 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
15330 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
15340 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65  d if the average
15350 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
15360 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c  repeats in the l
15370 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69  eft-most terms i
15380 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a  s at least 18. .
15390 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61    **.  ** The ma
153a0 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73  gic number 18 is
153b0 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65   selected on the
153c0 20 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e   basis that scan
153d0 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a  ning 17 rows.  *
153e0 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  * is almost alwa
153f0 79 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20  ys quicker than 
15400 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65  an index seek (e
15410 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68  ven though if th
15420 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e  e index.  ** con
15430 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
15440 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73   2^17 rows we as
15450 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69  sume otherwise i
15460 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66  n other parts of
15470 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e  .  ** the code).
15480 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74   And, even if it
15490 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75   is not, it shou
154a0 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75  ld not be too mu
154b0 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a  ch slower. .  **
154c0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
154d0 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65  nd, the extra se
154e0 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70  eks could end up
154f0 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61   being significa
15500 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65  ntly.  ** more e
15510 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20  xpensive.  */.  
15520 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69  assert( 42==sqli
15530 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b  te3LogEst(18) );
15540 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71  .  if( saved_nEq
15550 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20  ==saved_nSkip.  
15560 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c   && saved_nEq+1<
15570 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a  pProbe->nKeyCol.
15580 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f     && pProbe->no
15590 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26  SkipScan==0.   &
155a0 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  & pProbe->aiRowL
155b0 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  ogEst[saved_nEq+
155c0 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e  1]>=42  /* TUNIN
155d0 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73  G: Minimum for s
155e0 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26  kip-scan */.   &
155f0 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  & (rc = whereLoo
15600 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
15610 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
15620 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
15630 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49  ){.    LogEst nI
15640 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ter;.    pNew->u
15650 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
15660 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b    pNew->nSkip++;
15670 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
15680 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
15690 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
156a0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
156b0 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20  E_SKIPSCAN;.    
156c0 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e  nIter = pProbe->
156d0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
156e0 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  d_nEq] - pProbe-
156f0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
15700 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70  ed_nEq+1];.    p
15710 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74  New->nOut -= nIt
15720 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e  er;.    /* TUNIN
15730 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65  G:  Because unce
15740 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65  rtainties in the
15750 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73   estimates for s
15760 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73  kip-scan queries
15770 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31  ,.    ** add a 1
15780 2e 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f  .375 fudge facto
15790 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73  r to make skip-s
157a0 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73  can slightly les
157b0 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20  s likely. */.   
157c0 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20   nIter += 5;.   
157d0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
157e0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
157f0 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
15800 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b  nIter + nInMul);
15810 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
15820 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
15830 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15840 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
15850 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
15860 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a   = saved_nSkip;.
15870 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15880 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
15890 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  s;.  }..  return
158a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
158b0 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
158c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
158d0 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
158e0 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
158f0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
15900 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
15910 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
15920 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
15930 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
15940 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
15950 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
15960 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
15970 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
15980 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
15990 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
159a0 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
159b0 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
159c0 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
159d0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
159e0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
159f0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
15a00 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
15a10 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
15a20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
15a30 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
15a40 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
15a50 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
15a60 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
15a70 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
15a80 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
15a90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15aa0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
15ab0 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
15ac0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
15ad0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
15ae0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
15af0 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
15b00 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
15b10 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
15b20 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
15b30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
15b40 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66  rsor ){.      if
15b50 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
15b60 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
15b70 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a       for(jj=0; j
15b80 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  j<pIndex->nKeyCo
15b90 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  l; jj++){.      
15ba0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
15bb0 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69  lumn==pIndex->ai
15bc0 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74  Column[jj] ) ret
15bd0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
15be0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15bf0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
15c00 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77  turn a bitmask w
15c10 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65  here 1s indicate
15c20 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73   that the corres
15c30 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  ponding column o
15c40 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69  f.** the table i
15c50 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  s used by an ind
15c60 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69  ex.  Only the fi
15c70 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61  rst 63 columns a
15c80 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a  re considered..*
15c90 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
15ca0 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28   columnsInIndex(
15cb0 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
15cc0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20  Bitmask m = 0;. 
15cd0 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
15ce0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b  pIdx->nColumn-1;
15cf0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
15d00 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61   int x = pIdx->a
15d10 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
15d20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20  if( x>=0 ){.    
15d30 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
15d40 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
15d50 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32  stcase( x==BMS-2
15d60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c   );.      if( x<
15d70 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53  BMS-1 ) m |= MAS
15d80 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20  KBIT(x);.    }. 
15d90 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d   }.  return m;.}
15da0 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  ../* Check to se
15db0 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69  e if a partial i
15dc0 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49  ndex with pPartI
15dd0 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65  ndexWhere can be
15de0 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20   used.** in the 
15df0 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20  current query.  
15e00 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
15e10 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c  t can be and fal
15e20 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
15e30 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73  atic int whereUs
15e40 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
15e50 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65  (int iTab, Where
15e60 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
15e70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *pWhere){.  in
15e80 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
15e90 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65   *pTerm;.  while
15ea0 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b  ( pWhere->op==TK
15eb0 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  _AND ){.    if( 
15ec0 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74  !whereUsablePart
15ed0 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57  ialIndex(iTab,pW
15ee0 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29  C,pWhere->pLeft)
15ef0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
15f00 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65   pWhere = pWhere
15f10 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20  ->pRight;.  }.  
15f20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
15f30 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
15f40 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
15f50 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
15f60 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
15f70 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
15f80 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
15f90 70 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65  pr(pExpr, pWhere
15fa0 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26  , iTab) .     &&
15fb0 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72   (!ExprHasProper
15fc0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
15fd0 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d  mJoin) || pExpr-
15fe0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
15ff0 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20  ==iTab).    ){. 
16000 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
16010 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16020 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
16030 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
16040 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69  objects for a si
16050 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68  ngle table of th
16060 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65  e join where the
16070 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65   table.** is ide
16080 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  nfied by pBuilde
16090 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
160a0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
160b0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
160c0 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
160d0 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
160e0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
160f0 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f   costs (WhereLoo
16100 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62  p.rRun) of the b
16110 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65  -tree loops adde
16120 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
16130 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c  on.** are calcul
16140 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
16150 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c  .**.** For a ful
16160 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67  l scan, assuming
16170 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69   the table (or i
16180 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e  ndex) contains n
16190 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20  Row rows:.**.** 
161a0 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
161b0 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20  * 3.0           
161c0 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c           // full
161d0 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20  -table scan.**  
161e0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
161f0 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
16200 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
16210 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  of covering inde
16220 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
16230 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20  nRow * (K+3.0)  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
16250 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76   scan of non-cov
16260 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
16270 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76  * where K is a v
16280 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31  alue between 1.1
16290 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73   and 3.0 set bas
162a0 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ed on the relati
162b0 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ve .** estimated
162c0 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
162d0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
162e0 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  able records..**
162f0 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78  .** For an index
16300 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69   scan, where nVi
16310 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  sit is the numbe
16320 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20  r of index rows 
16330 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68  visited.** by th
16340 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65  e scan, and nSee
16350 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  k is the number 
16360 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  of seek operatio
16370 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a  ns required on .
16380 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  ** the index b-t
16390 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ree:.**.**     c
163a0 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
163b0 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e  og(nRow) + K * n
163c0 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20  Visit)          
163d0 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  // covering inde
163e0 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
163f0 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
16400 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e  w) + (K+3.0) * n
16410 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e  Visit)    // non
16420 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
16430 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
16440 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65  nSeek is 1. nSee
16450 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72  k values greater
16460 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f   than 1 come abo
16470 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48  ut if the .** WH
16480 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75  ERE clause inclu
16490 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29  des "x IN (....)
164a0 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20  " terms used in 
164b0 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20  place of "x=?". 
164c0 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c  Or when .** impl
164d0 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45  icit "x IN (SELE
164e0 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20  CT x FROM tbl)" 
164f0 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
16500 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a  for skip-scans..
16510 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
16520 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77  ted values (nRow
16530 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29  , nVisit, nSeek)
16540 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61   often contain a
16550 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a   large amount.**
16560 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e   of uncertainty.
16570 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
16580 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65  n, scoring is de
16590 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70  signed to pick p
165a0 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f  lans that.** "do
165b0 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22   the least harm"
165c0 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65   if the estimate
165d0 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65  s are inaccurate
165e0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
165f0 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66  a.** log(nRow) f
16600 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64  actor is omitted
16610 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65   from a non-cove
16620 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
16630 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62  in order to.** b
16640 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20  ias the scoring 
16650 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e  in favor of usin
16660 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63  g an index, sinc
16670 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  e the worst-case
16680 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
16690 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
166a0 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20  x is far better 
166b0 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63  than the worst-c
166c0 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ase performance.
166d0 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  ** of a full tab
166e0 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74  le scan..*/.stat
166f0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
16700 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
16710 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
16720 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
16730 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
16740 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
16750 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20   mExtra         
16760 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
16770 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
16780 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
16790 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
167a0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
167b0 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
167c0 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
167d0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
167e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
167f0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
16800 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
16810 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16830 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
16840 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
16850 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c  imary key */.  L
16860 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b  ogEst aiRowEstPk
16870 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  [2];       /* Th
16880 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20  e aiRowLogEst[] 
16890 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
168a0 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36  k index */.  i16
168b0 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
168c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
168d0 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
168e0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
168f0 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
16900 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
16910 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
16920 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
16930 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
16940 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
16950 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
16960 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
16970 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
16980 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16990 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
169a0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
169b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
169c0 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
169d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
169e0 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
169f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16a00 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
16a10 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
16a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16a30 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
16a40 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
16a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16a60 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
16a70 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
16a80 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
16a90 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
16aa0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
16ab0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16ac0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
16ad0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
16ae0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
16af0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
16b00 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
16b10 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b30 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
16b40 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ied */.  .  pNew
16b50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
16b60 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  w;.  pWInfo = pB
16b70 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
16b80 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49    pTabList = pWI
16b90 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
16ba0 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74   pSrc = pTabList
16bb0 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
16bc0 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
16bd0 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70  >pTab;.  pWC = p
16be0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
16bf0 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
16c00 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
16c10 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  ;..  if( pSrc->p
16c20 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  IBIndex ){.    /
16c30 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
16c40 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
16c50 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
16c60 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
16c70 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
16c80 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  >pIBIndex;.  }el
16c90 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
16ca0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
16cb0 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
16cc0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
16cd0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
16ce0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
16cf0 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
16d00 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
16d10 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
16d20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
16d30 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
16d40 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
16d50 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
16d60 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
16d70 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
16d80 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
16d90 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
16da0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
16db0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
16dc0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
16dd0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16df0 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
16e00 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
16e10 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
16e20 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
16e30 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
16e40 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
16e50 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
16e60 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
16e70 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
16e80 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
16e90 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f  RowLogEst = aiRo
16ea0 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
16eb0 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
16ec0 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
16ed0 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  able = pTab;.   
16ee0 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20   sPk.szIdxRow = 
16ef0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
16f00 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
16f10 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ] = pTab->nRowLo
16f20 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  gEst;.    aiRowE
16f30 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  stPk[1] = 0;.   
16f40 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
16f50 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
16f60 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e    if( pSrc->fg.n
16f70 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
16f80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
16f90 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
16fa0 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
16fb0 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
16fc0 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
16fd0 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
16fe0 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
16ff0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17000 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
17010 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
17020 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
17030 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
17040 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ze = pTab->nRowL
17050 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  ogEst;.  rLogSiz
17060 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
17070 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
17080 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
17090 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
170a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
170b0 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
170c0 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f  r->pOrSet      /
170d0 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  * Not part of an
170e0 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
170f0 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66   */.   && (pWInf
17100 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
17110 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44  WHERE_NO_AUTOIND
17120 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  EX)==0.   && (pW
17130 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
17140 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
17150 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
17160 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e    && pSrc->pIBIn
17170 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48  dex==0      /* H
17180 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  as no INDEXED BY
17190 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
171a0 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e   !pSrc->fg.notIn
171b0 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e  dexed   /* Has n
171c0 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  o NOT INDEXED cl
171d0 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61  ause */.   && Ha
171e0 73 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20  sRowid(pTab)    
171f0 20 20 20 20 20 2f 2a 20 49 73 20 6e 6f 74 20 61       /* Is not a
17200 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
17210 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57 68  able. (FIXME: Wh
17220 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26  y not?) */.   &&
17230 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72   !pSrc->fg.isCor
17240 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61  related /* Not a
17250 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
17260 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20 21 70  uery */.   && !p
17270 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  Src->fg.isRecurs
17280 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65  ive  /* Not a re
17290 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74  cursive common t
172a0 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
172b0 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20   */.  ){.    /* 
172c0 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e  Generate auto-in
172d0 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a  dex WhereLoops *
172e0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
172f0 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72  *pTerm;.    Wher
17300 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20  eTerm *pWCEnd = 
17310 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
17320 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  erm;.    for(pTe
17330 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  rm=pWC->a; rc==S
17340 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
17350 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
17360 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
17370 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
17380 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
17390 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
173a0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
173b0 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
173c0 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20   pSrc, 0) ){.   
173d0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
173e0 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
173f0 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
17400 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
17410 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
17420 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
17430 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
17440 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
17450 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
17460 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
17470 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f  ING: One-time co
17480 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67  st for computing
17490 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
174a0 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20  ndex is.        
174b0 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20  ** estimated to 
174c0 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77  be X*N*log2(N) w
174d0 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
174e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
174f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
17500 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78  able being index
17510 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20 69  ed and where X i
17520 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20  s 7 (LogEst=28) 
17530 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20  for normal.     
17540 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20     ** tables or 
17550 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29  1.375 (LogEst=4)
17560 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
17570 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
17580 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
17590 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72   of X is smaller
175a0 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
175b0 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68 61  ubqueries so tha
175c0 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  t the query plan
175d0 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ner.        ** w
175e0 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72  ill be more aggr
175f0 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e  essive about gen
17600 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69  erating automati
17610 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20  c indexes for.  
17620 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f        ** those o
17630 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68  bjects, since th
17640 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74  ere is no opport
17650 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63 68  unity to add sch
17660 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ema.        ** i
17670 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65  ndexes on subque
17680 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20  ries and views. 
17690 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
176a0 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69  >rSetup = rLogSi
176b0 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a  ze + rSize + 4;.
176c0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
176d0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ->pSelect==0 && 
176e0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
176f0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
17700 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17710 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20  pNew->rSetup += 
17720 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  24;.        }.  
17730 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
17740 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
17750 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f  rSetup, pTab->co
17760 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
17770 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68   /* TUNING: Each
17780 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69   index lookup yi
17790 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20  elds 20 rows in 
177a0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
177b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d  .        ** is m
177c0 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75  ore than the usu
177d0 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72  al guess of 10 r
177e0 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61  ows, since we ha
177f0 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20  ve no way.      
17800 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20    ** of knowing 
17810 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68  how selective th
17820 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74  e index will ult
17830 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20  imately be.  It 
17840 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
17850 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e   not be unreason
17860 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69  able to make thi
17870 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72  s value much lar
17880 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
17890 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b  pNew->nOut = 43;
178a0 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71    assert( 43==sq
178b0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20  lite3LogEst(20) 
178c0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
178d0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
178e0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
178f0 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  e,pNew->nOut);. 
17900 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
17910 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54  lags = WHERE_AUT
17920 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20  O_INDEX;.       
17930 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
17940 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e  mExtra | pTerm->
17950 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
17960 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
17970 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
17980 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
17990 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
179a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
179b0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
179c0 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  EX */..  /* Loop
179d0 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65   over all indice
179e0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72  s.  */.  for(; r
179f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17a00 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
17a10 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53  Probe->pNext, iS
17a20 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ortIdx++){.    i
17a30 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  f( pProbe->pPart
17a40 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20  IdxWhere!=0.    
17a50 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65   && !whereUsable
17a60 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72  PartialIndex(pSr
17a70 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c  c->iCursor, pWC,
17a80 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
17a90 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
17aa0 20 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d   testcase( pNew-
17ab0 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75  >iTab!=pSrc->iCu
17ac0 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20  rsor );  /* See 
17ad0 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38  ticket [98d973b8
17ae0 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  f5] */.      con
17af0 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69  tinue;  /* Parti
17b00 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f  al index inappro
17b10 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20  priate for this 
17b20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20  query */.    }. 
17b30 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62     rSize = pProb
17b40 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  e->aiRowLogEst[0
17b50 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  ];.    pNew->u.b
17b60 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
17b70 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
17b80 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
17b90 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
17ba0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
17bb0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
17bc0 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
17bd0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
17be0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
17bf0 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
17c00 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
17c10 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
17c20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
17c30 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
17c40 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
17c50 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
17c60 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
17c70 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
17c80 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
17c90 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
17ca0 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
17cb0 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
17cc0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
17cd0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
17ce0 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
17cf0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
17d00 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
17d10 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
17d20 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
17d30 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
17d40 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
17d50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
17d60 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
17d70 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
17d80 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
17d90 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a  dx : 0;.      /*
17da0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
17db0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
17dc0 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a   is (N*3.0). */.
17dd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
17de0 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20   = rSize + 16;. 
17df0 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
17e00 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
17e10 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  Run, pTab->costM
17e20 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ult);.      wher
17e30 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
17e40 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
17e50 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ze);.      rc = 
17e60 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
17e70 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
17e80 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
17e90 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
17ea0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
17eb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17ec0 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20    Bitmask m;.   
17ed0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69     if( pProbe->i
17ee0 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20  sCovering ){.   
17ef0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17f00 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs = WHERE_IDX_O
17f10 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
17f20 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  XED;.        m =
17f30 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
17f40 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72  .        m = pSr
17f50 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  c->colUsed & ~co
17f60 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72  lumnsInIndex(pPr
17f70 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  obe);.        pN
17f80 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
17f90 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
17fa0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
17fb0 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
17fc0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
17fd0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
17fe0 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
17ff0 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
18000 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
18010 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
18020 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
18030 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
18040 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
18050 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a    && (pProbe->sz
18060 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
18070 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  abRow).         
18080 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
18090 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
180a0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
180b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
180c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
180d0 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
180e0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
180f0 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
18100 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
18110 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
18120 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
18130 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18140 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
18150 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
18160 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
18170 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  The cost of visi
18180 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72  ting the index r
18190 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72  ows is N*K, wher
181a0 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e K is.        *
181b0 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  * between 1.1 an
181c0 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67  d 3.0, depending
181d0 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
181e0 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20   sizes of the.  
181f0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61        ** index a
18200 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49  nd table rows. I
18210 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d  f this is a non-
18220 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
18230 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  can,.        ** 
18240 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73  also add the cos
18250 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61  t of visiting ta
18260 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29  ble rows (N*3.0)
18270 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
18280 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
18290 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
182a0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
182b0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
182c0 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b       if( m!=0 ){
182d0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
182e0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
182f0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
18300 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a  Run, rSize+16);.
18310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18320 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
18330 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
18340 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
18350 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
18360 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
18370 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
18380 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
18390 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
183a0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
183b0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
183c0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
183d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
183e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
183f0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68    }..    rc = wh
18400 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
18410 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
18420 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b  Src, pProbe, 0);
18430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18440 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
18450 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT4.    sqlite3
18460 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70  Stat4ProbeFree(p
18470 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a  Builder->pRec);.
18480 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
18490 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  ecValid = 0;.   
184a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
184b0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
184c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
184d0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
184e0 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
184f0 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
18500 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
18510 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
18520 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
18530 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
18540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
18550 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18560 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
18570 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
18580 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
18590 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
185a0 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
185b0 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
185c0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
185d0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
185e0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
185f0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
18600 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
18610 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53   no LEFT or CROS
18620 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20  S JOIN joins in 
18630 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20  the query, both 
18640 6d 45 78 74 72 61 20 61 6e 64 0a 2a 2a 20 6d 55  mExtra and.** mU
18650 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74 20  nusable are set 
18660 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c  to 0. Otherwise,
18670 20 6d 45 78 74 72 61 20 69 73 20 61 20 6d 61 73   mExtra is a mas
18680 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  k of all FROM cl
18690 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ause.** entries 
186a0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
186b0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
186c0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
186d0 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a  clause and are.*
186e0 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  * separated from
186f0 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
18700 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53  one LEFT or CROS
18710 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c  S JOIN. Similarl
18720 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61  y, the.** mUnusa
18730 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  ble mask contain
18740 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  s all FROM claus
18750 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  e entries that o
18760 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a  ccur after the.*
18770 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
18780 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74 65  and are separate
18790 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
187a0 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
187b0 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e  r .** CROSS JOIN
187c0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  . .**.** For exa
187d0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
187e0 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  ry were:.**.**  
187f0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32   ... FROM t1, t2
18800 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74   LEFT JOIN t3, t
18810 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e  4, vt CROSS JOIN
18820 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74   t5, t6;.**.** t
18830 68 65 6e 20 6d 45 78 74 72 61 20 63 6f 72 72 65  hen mExtra corre
18840 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74  sponds to (t1, t
18850 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65  2) and mUnusable
18860 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a   to (t5, t6)..**
18870 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c  .** All the tabl
18880 65 73 20 69 6e 20 6d 45 78 74 72 61 20 6d 75 73  es in mExtra mus
18890 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
188a0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
188b0 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c  virtual .** tabl
188c0 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20  e. So any terms 
188d0 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72  for which all pr
188e0 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
188f0 73 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a  satisfied by .**
18900 20 6d 45 78 74 72 61 20 6d 61 79 20 62 65 20 73   mExtra may be s
18910 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73 61  pecified as "usa
18920 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c  ble" in all call
18930 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e  s to xBestIndex.
18940 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c   .** Conversely,
18950 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d   all tables in m
18960 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65  Unusable must be
18970 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
18980 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69  he current.** vi
18990 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20  rtual table, so 
189a0 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68  any terms for wh
189b0 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75 69  ich the prerequi
189c0 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69  sites overlap wi
189d0 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  th.** mUnusable 
189e0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
189f0 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22   configured as "
18a00 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20  not-usable" for 
18a10 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73  xBestIndex..*/.s
18a20 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
18a30 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20  oopAddVirtual(. 
18a40 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
18a50 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a  r *pBuilder,  /*
18a60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
18a70 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
18a80 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20 20  itmask mExtra,  
18a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18aa0 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
18ab0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
18ac0 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  e this one */.  
18ad0 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
18ae0 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
18af0 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
18b00 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65   be scanned afte
18b10 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b  r this one */.){
18b20 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
18b30 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
18b40 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
18b50 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  s context */.  P
18b60 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
18b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18b80 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
18b90 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
18ba0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
18bb0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
18bc0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
18bd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18be0 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68  m *pSrc;   /* Th
18bf0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
18c00 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
18c10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
18c20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18c30 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
18c40 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
18c50 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
18c60 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
18c70 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
18c80 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
18c90 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
18ca0 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
18cb0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
18cc0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
18cd0 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b  t iTerm, mxTerm;
18ce0 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
18cf0 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e  nt;.  int seenIn
18d00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
18d10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
18d20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
18d30 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65  seen */.  int se
18d40 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20  enVar = 0;      
18d50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18d60 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  f a non-constant
18d70 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73   constraint is s
18d80 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68  een */.  int iPh
18d90 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
18da0 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73        /* 0: cons
18db0 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e  t w/o IN, 1: con
18dc0 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32  st, 2: no IN,  2
18dd0 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  : IN */.  WhereL
18de0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  oop *pNew;.  int
18df0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18e00 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 45 78  ..  assert( (mEx
18e10 74 72 61 20 26 20 6d 55 6e 75 73 61 62 6c 65 29  tra & mUnusable)
18e20 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20  ==0 );.  pWInfo 
18e30 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
18e40 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
18e50 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
18e60 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
18e70 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
18e80 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20  er->pWC;.  pNew 
18e90 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
18ea0 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e  ;.  pSrc = &pWIn
18eb0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
18ec0 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70  pNew->iTab];.  p
18ed0 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
18ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69  ;.  assert( IsVi
18ef0 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20  rtual(pTab) );. 
18f00 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
18f10 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
18f20 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73  arse, pWC, mUnus
18f30 61 62 6c 65 2c 20 70 53 72 63 2c 70 42 75 69 6c  able, pSrc,pBuil
18f40 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
18f50 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
18f60 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
18f70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
18f80 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
18f90 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
18fa0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
18fb0 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
18fc0 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
18fd0 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  LTerm = 0;.  pNe
18fe0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
18ff0 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65  ee = 0;.  pUsage
19000 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
19010 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
19020 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
19030 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
19040 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
19050 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
19060 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
19070 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
19080 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
19090 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  Info);.    retur
190a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
190b0 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73    }..  for(iPhas
190c0 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
190d0 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
190e0 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
190f0 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
19100 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
19110 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
19120 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
19130 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
19140 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
19150 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
19160 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
19170 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
19180 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
19190 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
191a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
191b0 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
191c0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
191d0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
191e0 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
191f0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
19200 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
19210 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
19220 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
19230 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
19240 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
19250 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
19260 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
19270 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
19280 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
19290 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
192a0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
192b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
192c0 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
192d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
192e0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
192f0 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45 78 74  reqRight & ~mExt
19300 72 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ra)!=0 ){.      
19310 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20        seenVar = 
19320 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
19330 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
19340 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
19350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19360 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
19370 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
19380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19390 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
193a0 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 1:    /* Con
193b0 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f  stants with IN o
193c0 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  perators */.    
193d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
193e0 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
193f0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
19400 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
19410 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45 78 74  reqRight & ~mExt
19420 72 61 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  ra)==0;.        
19430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19440 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56   case 2:    /* V
19450 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74  ariables without
19460 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
19470 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
19480 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
19490 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
194a0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
194b0 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a  or & WO_IN)==0;.
194c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
194d0 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
194e0 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  :   /* Variables
194f0 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20   with IN */.    
19500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
19510 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20  enVar && seenIn 
19520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
19530 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
19540 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
19550 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19560 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73  }.    memset(pUs
19570 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
19580 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
19590 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
195a0 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
195b0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
195c0 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
195d0 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
195e0 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49  xStr);.    pIdxI
195f0 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
19600 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
19610 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70  dxNum = 0;.    p
19620 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
19630 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
19640 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
19650 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
19660 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
19670 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
19680 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
19690 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
196a0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
196b0 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20  tedRows = 25;.  
196c0 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
196d0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
196e0 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
196f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
19700 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
19710 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43  _exit;.    pIdxC
19720 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
19730 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
19740 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
19750 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
19760 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
19770 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
19780 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20   mxTerm = -1;.  
19790 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
197a0 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61  nLSlot>=nConstra
197b0 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  int );.    for(i
197c0 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
197d0 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c  t; i++) pNew->aL
197e0 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Term[i] = 0;.   
197f0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
19800 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  itMask = 0;.    
19810 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
19820 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
19830 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
19840 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73  if( (iTerm = pUs
19850 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
19860 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20   - 1)>=0 ){.    
19870 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
19880 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
19890 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
198a0 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  >=nConstraint.  
198b0 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
198c0 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
198d0 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  ->nTerm.        
198e0 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d   || pNew->aLTerm
198f0 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20  [iTerm]!=0.     
19900 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
19910 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
19920 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  R;.          sql
19930 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19940 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e  rse, "%s.xBestIn
19950 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f  dex() malfunctio
19960 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
19970 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
19980 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
19990 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  b_exit;.        
199a0 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
199b0 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73  se( iTerm==nCons
199c0 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20  traint-1 );.    
199d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
199e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
199f0 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e  stcase( j==pWC->
19a00 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20  nTerm-1 );.     
19a10 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
19a20 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  >a[j];.        p
19a30 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70  New->prereq |= p
19a40 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
19a50 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
19a60 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
19a70 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20  LSlot );.       
19a80 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
19a90 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  erm] = pTerm;.  
19aa0 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
19ab0 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20  mxTerm ) mxTerm 
19ac0 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = iTerm;.       
19ad0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
19ae0 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ==15 );.        
19af0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
19b00 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  =16 );.        i
19b10 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70  f( iTerm<16 && p
19b20 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20  Usage[i].omit ) 
19b30 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
19b40 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72  tMask |= 1<<iTer
19b50 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  m;.        if( (
19b60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19b70 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
19b80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55            if( pU
19b90 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20  sage[i].omit==0 
19ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
19bb0 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
19bc0 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f   to use an IN co
19bd0 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20  nstraint if the 
19be0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20  virtual table.  
19bf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79            ** say
19c00 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76  s that the equiv
19c10 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61  alent EQ constra
19c20 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61  int cannot be sa
19c30 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20  fely omitted..  
19c40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
19c50 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f  we do attempt to
19c60 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73   use such a cons
19c70 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77  traint, some row
19c80 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20  s might be.     
19c90 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74         ** repeat
19ca0 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ed in the output
19cb0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
19cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
19ce0 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
19cf0 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
19d00 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c  ined by an IN cl
19d10 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20  ause may not.   
19d20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d         ** consum
19d30 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
19d40 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31  lause because (1
19d50 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49  ) the order of I
19d60 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20  N terms.        
19d70 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65    ** is not nece
19d80 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  ssarily related 
19d90 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  to the order of 
19da0 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64  output terms and
19db0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32  .          ** (2
19dc0 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75  ) Multiple outpu
19dd0 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ts from a single
19de0 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e   IN value will n
19df0 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20  ot merge.       
19e00 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20     ** together. 
19e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
19e20 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
19e30 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
19e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19e50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
19e60 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  nConstraint ){. 
19e70 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
19e80 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20  m = mxTerm+1;.  
19e90 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
19ea0 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e  ->nLTerm<=pNew->
19eb0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
19ec0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
19ed0 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
19ee0 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e  idxNum;.      pN
19ef0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
19f00 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  ree = pIdxInfo->
19f10 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
19f20 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
19f30 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19f40 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  tr = 0;.      pN
19f50 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
19f60 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  r = pIdxInfo->id
19f70 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  xStr;.      pNew
19f80 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
19f90 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e  ed = (i8)(pIdxIn
19fa0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
19fb0 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20  med ?.          
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
19fe0 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a  Info->nOrderBy :
19ff0 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
1a000 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
1a010 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1a020 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f  sqlite3LogEstFro
1a030 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
1a040 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
1a050 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
1a060 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
1a070 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  st(pIdxInfo->est
1a080 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20  imatedRows);.   
1a090 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65     whereLoopInse
1a0a0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1a0b0 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  w);.      if( pN
1a0c0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1a0d0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ree ){.        s
1a0e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1a0f0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
1a100 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a110 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1a120 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1a130 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c   }.  }  ..whereL
1a140 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a  oopAddVtab_exit:
1a150 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
1a160 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1a170 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
1a180 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
1a190 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
1a1a0 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
1a1b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a1c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1a1d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a1e0 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ABLE */../*.** A
1a1f0 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  dd WhereLoop ent
1a200 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f  ries to handle O
1a210 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77  R terms.  This w
1a220 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a  orks for either.
1a230 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72  ** btrees or vir
1a240 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  tual tables..*/.
1a250 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1a260 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68 65  LoopAddOr(.  Whe
1a270 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
1a280 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d  Builder, .  Bitm
1a290 61 73 6b 20 6d 45 78 74 72 61 2c 20 0a 20 20 42  ask mExtra, .  B
1a2a0 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1a2b0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
1a2c0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1a2d0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68  er->pWInfo;.  Wh
1a2e0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
1a2f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1a300 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  w;.  WhereTerm *
1a310 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a  pTerm, *pWCEnd;.
1a320 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a330 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72  E_OK;.  int iCur
1a340 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1a350 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  tempWC;.  WhereL
1a360 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42  oopBuilder sSubB
1a370 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53  uild;.  WhereOrS
1a380 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20  et sSum, sCur;. 
1a390 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1a3a0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
1a3b0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
1a3c0 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20  ->pWC;.  pWCEnd 
1a3d0 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
1a3e0 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20  nTerm;.  pNew = 
1a3f0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
1a400 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20    memset(&sSum, 
1a410 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29  0, sizeof(sSum))
1a420 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
1a430 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
1a440 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
1a450 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
1a460 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54  ursor;..  for(pT
1a470 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
1a480 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
1a490 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
1a4a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
1a4b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1a4c0 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
1a4d0 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
1a4e0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
1a4f0 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
1a500 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
1a510 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
1a520 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
1a530 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1a540 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
1a550 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
1a560 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
1a570 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
1a580 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1a590 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
1a5a0 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
1a5b0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
1a5c0 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42      .      sSubB
1a5d0 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72  uild = *pBuilder
1a5e0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1a5f0 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
1a600 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1a610 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a  pOrSet = &sCur;.
1a620 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1a630 45 28 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e  E(0x200, ("Begin
1a640 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63   processing OR-c
1a650 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65  lause %p\n", pTe
1a660 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  rm));.      for(
1a670 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
1a680 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45  ; pOrTerm<pOrWCE
1a690 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  nd; pOrTerm++){.
1a6a0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
1a6b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1a6c0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
1a6d0 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
1a6e0 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65  ild.pWC = &pOrTe
1a6f0 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
1a700 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  wc;.        }els
1a710 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
1a720 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1a730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  ){.          tem
1a740 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43  pWC.pWInfo = pWC
1a750 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20  ->pWInfo;.      
1a760 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65      tempWC.pOute
1a770 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
1a780 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
1a790 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
1a7a0 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
1a7b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  1;.          tem
1a7c0 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
1a7d0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
1a7e0 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70  uild.pWC = &temp
1a7f0 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  WC;.        }els
1a800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
1a810 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1a820 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20  .        sCur.n 
1a830 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52  = 0;.#ifdef WHER
1a840 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
1a850 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
1a860 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65  E(0x200, ("OR-te
1a870 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73 20  rm %d of %p has 
1a880 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c  %d subterms:\n",
1a890 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1a8a0 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65       (int)(pOrTe
1a8b0 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54  rm-pOrWC->a), pT
1a8c0 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70  erm, sSubBuild.p
1a8d0 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20  WC->nTerm));.   
1a8e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1a8f0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 34  WhereTrace & 0x4
1a900 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
1a910 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75 62 42  for(i=0; i<sSubB
1a920 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  uild.pWC->nTerm;
1a930 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1a940 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
1a950 74 28 26 73 53 75 62 42 75 69 6c 64 2e 70 57 43  t(&sSubBuild.pWC
1a960 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  ->a[i], i);.    
1a970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a980 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
1a990 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1a9a0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1a9b0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1a9c0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
1a9d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1a9e0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1a9f0 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  al(&sSubBuild, m
1aa00 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65  Extra, mUnusable
1aa10 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1aa20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1aa30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1aa40 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
1aa50 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  ee(&sSubBuild, m
1aa60 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20  Extra);.        
1aa70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1aa80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1aa90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1aaa0 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53  ereLoopAddOr(&sS
1aab0 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c  ubBuild, mExtra,
1aac0 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1aad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1aae0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1aaf0 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d  E_OK || sCur.n==
1ab00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1ab10 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20   sCur.n==0 ){.  
1ab20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1ab30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
1ab40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1ab50 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  se if( once ){. 
1ab60 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
1ab70 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75  Move(&sSum, &sCu
1ab80 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  r);.          on
1ab90 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
1aba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1abb0 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65   WhereOrSet sPre
1abc0 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  v;.          whe
1abd0 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c  reOrMove(&sPrev,
1abe0 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20   &sSum);.       
1abf0 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
1ac00 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1ac10 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b  ; i<sPrev.n; i++
1ac20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1ac30 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e  or(j=0; j<sCur.n
1ac40 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1ac50 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
1ac60 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76  ert(&sSum, sPrev
1ac70 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73  .a[i].prereq | s
1ac80 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c  Cur.a[j].prereq,
1ac90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1acb0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1acc0 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73  rev.a[i].rRun, s
1acd0 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a  Cur.a[j].rRun),.
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ad00 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1ad10 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43  ev.a[i].nOut, sC
1ad20 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a  ur.a[j].nOut));.
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ad40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ad50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ad60 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1ad70 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   1;.      pNew->
1ad80 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
1ad90 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  m;.      pNew->w
1ada0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
1adb0 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70  ULTI_OR;.      p
1adc0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1add0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
1ade0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  rtIdx = 0;.     
1adf0 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75   memset(&pNew->u
1ae00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77  , 0, sizeof(pNew
1ae10 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  ->u));.      for
1ae20 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
1ae30 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b  _OK && i<sSum.n;
1ae40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
1ae50 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e  * TUNING: Curren
1ae60 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  tly sSum.a[i].rR
1ae70 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  un is set to the
1ae80 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74   sum of the cost
1ae90 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  s.        ** of 
1aea0 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65  all sub-scans re
1aeb0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
1aec0 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20  -scan. However, 
1aed0 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a  due to rounding.
1aee0 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72          ** error
1aef0 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61  s, it may be tha
1af00 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  t the cost of th
1af10 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75  e OR-scan is equ
1af20 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20  al to its.      
1af30 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73    ** most expens
1af40 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64  ive sub-scan. Ad
1af50 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70  d the smallest p
1af60 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20  ossible penalty 
1af70 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75  .        ** (equ
1af80 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69  ivalent to multi
1af90 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20  plying the cost 
1afa0 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75  by 1.07) to ensu
1afb0 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  re that .       
1afc0 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f   ** this does no
1afd0 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77  t happen. Otherw
1afe0 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63  ise, for WHERE c
1aff0 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74  lauses such as t
1b000 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  he.        ** fo
1b010 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68  llowing where th
1b020 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
1b030 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20  on "y":.        
1b040 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
1b050 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f    WHERE likeliho
1b060 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52  od(x=?, 0.99) OR
1b070 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a   y=?.        **.
1b080 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
1b090 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74  lanner may elect
1b0a0 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65   to "OR" togethe
1b0b0 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73  r a full-table s
1b0c0 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  can and an.     
1b0d0 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b     ** index look
1b0e0 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69  up. And other si
1b0f0 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75  milarly odd resu
1b100 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  lts.  */.       
1b110 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53   pNew->rRun = sS
1b120 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31  um.a[i].rRun + 1
1b130 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1b140 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  nOut = sSum.a[i]
1b150 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70  .nOut;.        p
1b160 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53  New->prereq = sS
1b170 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a  um.a[i].prereq;.
1b180 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1b190 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1b1a0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1b1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
1b1c0 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1b1d0 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f  End processing O
1b1e0 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20  R-clause %p\n", 
1b1f0 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20  pTerm));.    }. 
1b200 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b210 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
1b220 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1b230 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
1b240 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
1b250 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
1b260 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
1b270 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
1b280 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1b290 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
1b2a0 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
1b2b0 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
1b2c0 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
1b2d0 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
1b2e0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1b2f0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
1b300 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1b310 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1b320 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  em;.  struct Src
1b330 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20  List_item *pEnd 
1b340 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
1b350 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  WInfo->nLevel];.
1b360 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1b370 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1b380 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
1b390 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
1b3a0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75  eLoop *pNew;.  u
1b3b0 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20  8 priorJointype 
1b3c0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
1b3d0 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
1b3e0 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
1b3f0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
1b400 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
1b410 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
1b420 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
1b430 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
1b440 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
1b450 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20  >a; pItem<pEnd; 
1b460 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
1b470 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55  {.    Bitmask mU
1b480 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  nusable = 0;.   
1b490 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
1b4a0 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
1b4b0 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33  skSelf = sqlite3
1b4c0 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
1b4d0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
1b4e0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1b4f0 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
1b500 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72  ->fg.jointype|pr
1b510 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28  iorJointype) & (
1b520 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1b530 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))!=0 ){.      /
1b540 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  * This condition
1b550 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49   is true when pI
1b560 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20  tem is the FROM 
1b570 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74  clause term on t
1b580 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68  he.      ** righ
1b590 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61  t-hand-side of a
1b5a0 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
1b5b0 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d  OIN.  */.      m
1b5c0 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a  Extra = mPrior;.
1b5d0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
1b5e0 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d  ointype = pItem-
1b5f0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
1b600 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1b610 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
1b620 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1b630 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20  List_item *p;.  
1b640 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d      for(p=&pItem
1b650 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [1]; p<pEnd; p++
1b660 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ){.        if( m
1b670 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e  Unusable || (p->
1b680 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a  fg.jointype & (J
1b690 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
1b6a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
1b6b0 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69  Unusable |= sqli
1b6c0 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1b6d0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
1b6e0 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  t, p->iCursor);.
1b6f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b700 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  }.      rc = whe
1b710 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1b720 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
1b730 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  a, mUnusable);. 
1b740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b750 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b760 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c  dBtree(pBuilder,
1b770 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
1b780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b7a0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1b7b0 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  Or(pBuilder, mEx
1b7c0 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  tra, mUnusable);
1b7d0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
1b7e0 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
1b7f0 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
1b800 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1b810 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
1b820 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ..  whereLoopCle
1b830 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ar(db, pNew);.  
1b840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b850 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68  .** Examine a Wh
1b860 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68  erePath (with th
1b870 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68  e addition of th
1b880 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f  e extra WhereLoo
1b890 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20  p of the 5th.** 
1b8a0 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73  parameters) to s
1b8b0 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73  ee if it outputs
1b8c0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
1b8d0 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a  uested ORDER BY.
1b8e0 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  ** (or GROUP BY)
1b8f0 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69   without requiri
1b900 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f  ng a separate so
1b910 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52  rt operation.  R
1b920 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20  eturn N:.** .** 
1b930 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73    N>0:   N terms
1b940 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1b950 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1b960 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a  sfied.**   N==0:
1b970 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68    No terms of th
1b980 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1b990 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1b9a0 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e  **   N<0:   Unkn
1b9b0 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79  own yet how many
1b9c0 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20   terms of ORDER 
1b9d0 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69  BY might be sati
1b9e0 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20  sfied.   .**.** 
1b9f0 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73  Note that proces
1ba00 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47  sing for WHERE_G
1ba10 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45  ROUPBY and WHERE
1ba20 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e  _DISTINCTBY is n
1ba30 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e  ot as.** strict.
1ba40 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20    With GROUP BY 
1ba50 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65  and DISTINCT the
1ba60 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e   only requiremen
1ba70 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75  t is that.** equ
1ba80 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70  ivalent rows app
1ba90 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ear immediately 
1baa0 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20  adjacent to one 
1bab0 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20  another.  GROUP 
1bac0 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e  BY.** and DISTIN
1bad0 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  CT do not requir
1bae0 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72  e rows to appear
1baf0 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c   in any particul
1bb00 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67  ar order as long
1bb10 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e  .** as equivalen
1bb20 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70  t rows are group
1bb30 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68  ed together.  Th
1bb40 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20  us for GROUP BY 
1bb50 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20  and DISTINCT.** 
1bb60 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72  the pOrderBy ter
1bb70 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  ms can be matche
1bb80 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20  d in any order. 
1bb90 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20   With ORDER BY, 
1bba0 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79  the .** pOrderBy
1bbb0 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d   terms must be m
1bbc0 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74  atched in strict
1bbd0 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f   left-to-right o
1bbe0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1bbf0 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69  i8 wherePathSati
1bc00 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20  sfiesOrderBy(.  
1bc10 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1bc20 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  o,    /* The WHE
1bc30 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1bc40 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1bc50 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  y,   /* ORDER BY
1bc60 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
1bc70 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
1bc80 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68  to check */.  Wh
1bc90 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
1bca0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
1bcb0 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f  Path to check */
1bcc0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
1bcd0 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68  s,       /* Migh
1bce0 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f  t contain WHERE_
1bcf0 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45  GROUPBY or WHERE
1bd00 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20  _DISTINCTBY */. 
1bd10 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20   u16 nLoop,     
1bd20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bd30 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
1bd40 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
1bd50 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1bd60 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20  ast,     /* Add 
1bd70 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74  this WhereLoop t
1bd80 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61  o the end of pPa
1bd90 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
1bda0 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61   Bitmask *pRevMa
1bdb0 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d  sk     /* OUT: M
1bdc0 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ask of WhereLoop
1bdd0 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65  s to run in reve
1bde0 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a  rse order */.){.
1bdf0 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20    u8 revSet;    
1be00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1be10 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20  if rev is known 
1be20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20  */.  u8 rev;    
1be30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1be40 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64  mposite sort ord
1be50 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64  er */.  u8 revId
1be60 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
1be70 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65   Index sort orde
1be80 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65  r */.  u8 isOrde
1be90 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20  rDistinct;   /* 
1bea0 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c  All prior WhereL
1beb0 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64  oops are order-d
1bec0 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20  istinct */.  u8 
1bed0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b  distinctColumns;
1bee0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1bef0 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55  e loop has UNIQU
1bf00 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  E NOT NULL colum
1bf10 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74  ns */.  u8 isMat
1bf20 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ch;           /*
1bf30 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73   iColumn matches
1bf40 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   a term of the O
1bf50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1bf60 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
1bf70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bf80 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
1bf90 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
1bfa0 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
1bfb0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1bfc0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
1bfd0 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
1bfe0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
1bff0 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
1c000 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
1c010 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1c020 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1c030 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
1c040 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1c050 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
1c060 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
1c070 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
1c080 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
1c090 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1c0a0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
1c0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1c0c0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1c0d0 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
1c0e0 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
1c0f0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
1c100 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
1c110 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
1c120 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
1c130 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
1c140 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
1c150 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
1c160 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
1c170 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
1c180 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
1c190 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1c1a0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
1c1b0 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
1c1c0 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
1c1d0 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
1c1e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
1c1f0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
1c200 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
1c210 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
1c220 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1c230 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
1c240 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
1c250 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
1c260 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
1c270 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
1c280 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
1c290 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
1c2a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1c2b0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
1c2c0 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
1c2d0 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
1c2e0 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
1c2f0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
1c300 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
1c310 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
1c320 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1c330 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
1c340 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
1c350 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
1c360 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
1c370 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
1c380 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
1c390 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
1c3a0 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
1c3b0 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
1c3c0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
1c3d0 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
1c3e0 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
1c3f0 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
1c400 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
1c410 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
1c420 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
1c430 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1c440 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
1c450 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
1c460 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
1c470 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1c480 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
1c490 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
1c4a0 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
1c4b0 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
1c4c0 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
1c4d0 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
1c4e0 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
1c4f0 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
1c500 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
1c510 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
1c520 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
1c530 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
1c540 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
1c550 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
1c560 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
1c570 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
1c580 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
1c590 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
1c5a0 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
1c5b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
1c5c0 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
1c5d0 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
1c5e0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
1c5f0 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
1c600 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
1c610 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
1c620 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
1c630 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
1c640 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
1c650 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1c660 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
1c670 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
1c680 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
1c690 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
1c6a0 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
1c6b0 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
1c6c0 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
1c6d0 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
1c6e0 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
1c6f0 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
1c700 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
1c710 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
1c720 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
1c730 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
1c740 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
1c750 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
1c760 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
1c770 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
1c780 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
1c790 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
1c7a0 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
1c7b0 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
1c7c0 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
1c7d0 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
1c7e0 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
1c7f0 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
1c800 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1c810 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
1c820 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
1c830 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
1c840 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
1c850 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1c860 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1c870 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
1c880 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1c890 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
1c8a0 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
1c8b0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
1c8c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
1c8d0 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
1c8e0 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
1c8f0 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
1c900 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
1c910 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
1c920 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
1c930 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
1c940 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
1c950 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
1c960 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
1c970 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
1c980 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
1c990 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
1c9a0 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  0;.  for(iLoop=0
1c9b0 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
1c9c0 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
1c9d0 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
1c9e0 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
1c9f0 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
1ca00 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
1ca10 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f  askSelf;.    pLo
1ca20 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  op = iLoop<nLoop
1ca30 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   ? pPath->aLoop[
1ca40 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a  iLoop] : pLast;.
1ca50 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1ca60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1ca70 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
1ca80 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
1ca90 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
1caa0 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e   ) obSat = obDon
1cab0 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
1cac0 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d      }.    iCur =
1cad0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1cae0 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62  t->a[pLoop->iTab
1caf0 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20  ].iCursor;..    
1cb00 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
1cb10 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20  ORDER BY term X 
1cb20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  that is a column
1cb30 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66   in the table of
1cb40 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
1cb50 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69  ent loop for whi
1cb60 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d  ch there is term
1cb70 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20   in the WHERE.  
1cb80 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
1cb90 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c  he form X IS NUL
1cba0 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65  L or X=? that re
1cbb0 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74  ference only out
1cbc0 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e  er.    ** loops.
1cbd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1cbe0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
1cbf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1cc00 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
1cc10 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
1cc20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
1cc30 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
1cc40 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
1cc50 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1cc60 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1cc70 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1cc80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1cc90 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
1cca0 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
1ccb0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65  tinue;.      pTe
1ccc0 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
1ccd0 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66  eFindTerm(&pWInf
1cce0 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f  o->sWC, iCur, pO
1ccf0 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  BExpr->iColumn,.
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57         ~ready, W
1cd20 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
1cd30 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_IS, 0);.      
1cd40 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
1cd50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1cd60 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1cd70 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49  ator&(WO_EQ|WO_I
1cd80 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  S))!=0 && pOBExp
1cd90 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
1cda0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1cdb0 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20  har *z1, *z2;.  
1cdc0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1cdd0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1cde0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1cdf0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
1ce00 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1ce10 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
1ce20 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
1ce30 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ll;.        z1 =
1ce40 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
1ce50 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
1ce60 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1ce70 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
1ce80 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
1ce90 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
1cea0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
1ceb0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1cec0 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d       z2 = pColl-
1ced0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1cee0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1cef0 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20  mp(z1, z2)!=0 ) 
1cf00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1cf10 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1cf20 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
1cf30 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _IS );.      }. 
1cf40 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
1cf50 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
1cf60 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
1cf70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1cf80 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
1cf90 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
1cfa0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1cfb0 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
1cfc0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
1cfd0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
1cfe0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
1cff0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
1d000 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
1d010 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1d020 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
1d030 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
1d040 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d050 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1d060 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1d070 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
1d080 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
1d090 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
1d0a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
1d0b0 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
1d0c0 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
1d0d0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
1d0e0 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
1d0f0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1d100 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
1d110 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21  mn-1]==(-1) || !
1d120 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
1d130 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  >pTable));.     
1d140 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
1d150 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64  ct = IsUniqueInd
1d160 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ex(pIndex);.    
1d170 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
1d180 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
1d190 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1d1a0 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
1d1b0 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
1d1c0 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
1d1d0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
1d1e0 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
1d1f0 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
1d200 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
1d210 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1d220 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
1d230 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20  j=0; j<nColumn; 
1d240 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38  j++){.        u8
1d250 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75   bOnce;   /* Tru
1d260 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44  e to run the ORD
1d270 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f  ER BY search loo
1d280 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  p */..        /*
1d290 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e   Skip over == an
1d2a0 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20  d IS NULL terms 
1d2b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  */.        if( j
1d2c0 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
1d2d0 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
1d2e0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a  pLoop->nSkip==0.
1d2f0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20           && ((i 
1d300 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1d310 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26  j]->eOperator) &
1d320 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
1d330 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  L|WO_IS))!=0.   
1d340 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1d350 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e    if( i & WO_ISN
1d360 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
1d370 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
1d380 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a  rderDistinct );.
1d390 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
1d3a0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
1d3b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d3c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1d3d0 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20    .        }..  
1d3e0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
1d3f0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
1d400 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
1d410 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
1d420 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
1d430 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
1d440 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
1d450 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
1d460 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1d470 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
1d480 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
1d490 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1d4a0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
1d4b0 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
1d4c0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
1d4d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
1d4e0 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
1d4f0 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
1d500 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1d510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d520 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
1d530 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  1;.          rev
1d540 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
1d550 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
1d560 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20  n unconstrained 
1d570 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68  column that migh
1d580 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  t be NULL means 
1d590 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
1d5a0 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69    ** WhereLoop i
1d5b0 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72  s not well-order
1d5c0 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed.        */.  
1d5d0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
1d5e0 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
1d5f0 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
1d600 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
1d610 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1d620 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
1d630 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
1d640 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
1d650 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
1d660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
1d670 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1d680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1d690 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
1d6a0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
1d6b0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1d6c0 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
1d6d0 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
1d6e0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d   the index and m
1d6f0 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
1d700 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
1d710 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62      */.        b
1d720 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Once = 1;.      
1d730 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20    isMatch = 0;. 
1d740 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1d750 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65  bOnce && i<nOrde
1d760 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
1d770 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
1d780 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
1d790 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1d7a0 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
1d7b0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1d7c0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
1d7d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1d7e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
1d7f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1d800 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20  _GROUPBY );.    
1d810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d820 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1d830 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b  RE_DISTINCTBY );
1d840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
1d850 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48  wctrlFlags & (WH
1d860 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52  ERE_GROUPBY|WHER
1d870 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d  E_DISTINCTBY))==
1d880 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20  0 ) bOnce = 0;. 
1d890 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1d8a0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
1d8b0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
1d8c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
1d8d0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1d8e0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1d8f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
1d900 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  BExpr->iColumn!=
1d910 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
1d920 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
1d930 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ( iColumn>=0 ){.
1d940 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1d950 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d960 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1d970 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1d980 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1d990 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1d9a0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1d9b0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1d9c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1d9d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
1d9e0 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
1d9f0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
1da00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1da10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1da20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a     isMatch = 1;.
1da30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1da40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1da50 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26     if( isMatch &
1da60 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
1da70 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d  WHERE_GROUPBY)==
1da80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1da90 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1daa0 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f  sort order is co
1dab0 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f  mpatible in an O
1dac0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
1dad0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
1dae0 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
1daf0 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
1db00 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
1db10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
1db20 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
1db30 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
1db40 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
1db50 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1db60 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a   ) isMatch = 0;.
1db70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1db80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
1db90 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64   = revIdx ^ pOrd
1dba0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
1dbb0 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rder;.          
1dbc0 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65    if( rev ) *pRe
1dbd0 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  vMask |= MASKBIT
1dbe0 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  (iLoop);.       
1dbf0 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
1dc00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1dc10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1dc20 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20  f( isMatch ){.  
1dc30 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
1dc40 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
1dc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
1dc60 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
1dc70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
1dc80 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1dc90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1dca0 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
1dcb0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
1dcc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dcd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
1dce0 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
1dcf0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
1dd00 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29  0 || j<nKeyCol )
1dd10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
1dd20 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
1dd30 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
1dd40 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
1dd50 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
1dd60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dd80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
1dd90 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
1dda0 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
1ddb0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
1ddc0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
1ddd0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1dde0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
1ddf0 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
1de00 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1de10 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1de20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
1de30 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
1de40 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
1de50 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
1de60 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
1de70 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
1de80 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
1de90 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
1dea0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1deb0 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
1dec0 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
1ded0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
1dee0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
1def0 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
1df00 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20  Bitmask mTerm;. 
1df10 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
1df20 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
1df30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1df40 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
1df50 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1df60 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69      mTerm = sqli
1df70 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
1df80 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
1df90 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
1dfa0 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
1dfb0 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
1dfc0 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
1dfd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1dfe0 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
1dff0 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
1e000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
1e010 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
1e020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e030 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
1e040 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
1e050 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
1e060 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
1e070 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
1e080 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
1e090 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
1e0a0 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
1e0b0 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
1e0c0 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1e0d0 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
1e0e0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1e0f0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
1e100 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
1e110 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
1e120 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
1e130 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
1e140 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1e150 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
1e160 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
1e170 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
1e180 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
1e190 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1e1a0 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
1e1b0 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
1e1c0 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
1e1d0 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
1e1e0 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
1e1f0 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
1e200 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
1e210 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
1e220 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
1e230 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
1e240 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
1e250 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1e260 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
1e270 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1e280 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
1e290 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
1e2a0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1e2b0 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
1e2c0 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
1e2d0 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
1e2e0 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
1e2f0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
1e300 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
1e310 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
1e320 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
1e330 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
1e340 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
1e350 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
1e360 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1e370 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
1e380 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
1e390 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
1e3a0 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
1e3b0 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
1e3c0 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
1e3d0 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
1e3e0 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
1e3f0 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
1e400 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
1e410 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
1e420 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
1e430 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
1e440 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
1e450 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
1e460 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
1e470 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
1e480 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
1e490 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
1e4a0 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
1e4b0 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
1e4c0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
1e4d0 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
1e4e0 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
1e4f0 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
1e500 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
1e510 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
1e520 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
1e530 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
1e540 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1e550 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
1e560 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
1e570 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1e580 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
1e590 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1e5a0 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
1e5b0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1e5c0 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
1e5d0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
1e5e0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1e5f0 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
1e600 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
1e610 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
1e620 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
1e630 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
1e640 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
1e650 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1e660 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
1e670 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
1e680 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
1e690 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
1e6a0 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
1e6b0 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
1e6c0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
1e6d0 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
1e6e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1e6f0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
1e700 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
1e710 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
1e720 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
1e730 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
1e740 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
1e750 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
1e760 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
1e770 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
1e780 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
1e790 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
1e7a0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1e7b0 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
1e7c0 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
1e7d0 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
1e7e0 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
1e7f0 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
1e800 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
1e810 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
1e820 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
1e830 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
1e840 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
1e850 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
1e860 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
1e870 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
1e880 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
1e890 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
1e8a0 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
1e8b0 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
1e8c0 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
1e8d0 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
1e8e0 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
1e8f0 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
1e900 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
1e910 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
1e920 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
1e930 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
1e940 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
1e950 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
1e960 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
1e970 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
1e980 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
1e990 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
1e9a0 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
1e9b0 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1e9c0 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
1e9d0 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
1e9e0 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
1e9f0 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
1ea00 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
1ea10 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
1ea20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
1ea30 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29  w + estLog(nRow)
1ea40 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a   + rScale + 16;.
1ea50 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68  .  /* TUNING: Th
1ea60 65 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d  e cost of implem
1ea70 65 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20  enting DISTINCT 
1ea80 75 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69  using a B-TREE i
1ea90 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62  s.  ** similar b
1eaa0 75 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72  ut with a larger
1eab0 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f   constant of pro
1eac0 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20  portionality. . 
1ead0 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20   ** Multiply by 
1eae0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61  an additional fa
1eaf0 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f  ctor of 3.0.  */
1eb00 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
1eb10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1eb20 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
1eb30 29 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74  ){.    rSortCost
1eb40 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72   += 16;.  }..  r
1eb50 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b  eturn rSortCost;
1eb60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1eb70 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
1eb80 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74  eLoop objects at
1eb90 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
1eba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1ebb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
1ebc0 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
1ebd0 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
1ebe0 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
1ebf0 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
1ec00 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
1ec10 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
1ec20 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
1ec30 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41   fields..**.** A
1ec40 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74  ssume that the t
1ec50 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
1ec60 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20  utput rows that 
1ec70 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
1ec80 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62  sorted.** will b
1ec90 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68  e nRowEst (in th
1eca0 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73  e 10*log2 repres
1ecb0 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20  entation).  Or, 
1ecc0 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a  ignore sorting.*
1ecd0 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45  * costs if nRowE
1ece0 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  st==0..**.** Ret
1ecf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1ed00 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49   success or SQLI
1ed10 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65  TE_NOMEM of a me
1ed20 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
1ed30 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
1ed40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1ed50 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57  herePathSolver(W
1ed60 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1ed70 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74  , LogEst nRowEst
1ed80 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63  ){.  int mxChoic
1ed90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1eda0 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
1edb0 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
1edc0 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a   paths tracked *
1edd0 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20  /.  int nLoop;  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1edf0 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
1ee00 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
1ee10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ee30 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1ee40 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee60 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1ee70 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
1ee80 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
1ee90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1eea0 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
1eeb0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
1eec0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
1eed0 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
1eee0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1eef0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20  rs */.  int mxI 
1ef00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1ef10 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1ef20 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c  xt entry to repl
1ef30 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  ace */.  int nOr
1ef40 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
1ef50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ef60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1ef70 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  terms */.  LogEs
1ef80 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
1ef90 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1efa0 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
1efb0 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45   paths */.  LogE
1efc0 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20  st mxUnsorted = 
1efd0 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  0;    /* Maximum
1efe0 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   unsorted cost o
1eff0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20  f a set of path 
1f000 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46  */.  int nTo, nF
1f010 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rom;           /
1f020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
1f030 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f  d entries in aTo
1f040 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a  [] and aFrom[] *
1f050 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
1f060 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
1f070 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73   All nFrom paths
1f080 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73   at the previous
1f090 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
1f0a0 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20  ePath *aTo;     
1f0b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f        /* The nTo
1f0c0 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74   best paths at t
1f0d0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c  he current level
1f0e0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1f0f0 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *pFrom;         
1f100 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
1f110 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65   aFrom[] that we
1f120 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1f130 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1f140 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pTo;           /
1f150 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
1f160 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72  aTo[] that we ar
1f170 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
1f180 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c    WhereLoop *pWL
1f190 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  oop;        /* O
1f1a0 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ne of the WhereL
1f1b0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
1f1c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b   WhereLoop **pX;
1f1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1f1e0 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68  ed to divy up th
1f1f0 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20  e pSpace memory 
1f200 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f  */.  LogEst *aSo
1f210 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f  rtCost = 0;    /
1f220 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61  * Sorting and pa
1f230 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f  rtial sorting co
1f240 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  sts */.  char *p
1f250 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
1f260 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
1f270 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
1f280 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
1f290 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20   int nSpace;    
1f2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1f2b0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
1f2c0 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65  ocated at pSpace
1f2d0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1f2e0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1f2f0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1f300 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49  b;.  nLoop = pWI
1f310 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f  nfo->nLevel;.  /
1f320 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69  * TUNING: For si
1f330 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e  mple queries, on
1f340 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68  ly the best path
1f350 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a   is tracked..  *
1f360 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e  * For 2-way join
1f370 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61  s, the 5 best pa
1f380 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64  ths are followed
1f390 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73  ..  ** For joins
1f3a0 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61   of 3 or more ta
1f3b0 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20  bles, track the 
1f3c0 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f  10 best paths */
1f3d0 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e  .  mxChoice = (n
1f3e0 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28  Loop<=1) ? 1 : (
1f3f0 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31  nLoop==2 ? 5 : 1
1f400 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  0);.  assert( nL
1f410 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61  oop<=pWInfo->pTa
1f420 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
1f430 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
1f440 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  2, ("---- begin 
1f450 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73  solver.  (nRowEs
1f460 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73  t=%d)\n", nRowEs
1f470 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52  t));..  /* If nR
1f480 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e  owEst is zero an
1f490 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  d there is an OR
1f4a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
1f4b0 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69  gnore it. In thi
1f4c0 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20  s.  ** case the 
1f4d0 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20  purpose of this 
1f4e0 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d  call is to estim
1f4f0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
1f500 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a  f rows returned.
1f510 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72    ** by the over
1f520 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20  all query. Once 
1f530 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61  this estimate ha
1f540 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c  s been obtained,
1f550 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
1f560 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69   will invoke thi
1f570 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63  s function a sec
1f580 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e  ond time, passin
1f590 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61  g the estimate a
1f5a0 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45  s the.  ** nRowE
1f5b0 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a  st parameter.  *
1f5c0 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
1f5d0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
1f5e0 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
1f5f0 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
1f600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64   }else{.    nOrd
1f610 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  erBy = pWInfo->p
1f620 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
1f630 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
1f640 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
1f650 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c  e space for aTo,
1f660 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74   aFrom and aSort
1f670 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61  Cost[] */.  nSpa
1f680 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ce = (sizeof(Whe
1f690 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
1f6a0 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
1f6b0 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
1f6c0 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66  nSpace += sizeof
1f6d0 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
1f6e0 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  rBy;.  pSpace = 
1f6f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1f700 61 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  aw(db, nSpace);.
1f710 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
1f720 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1f730 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
1f740 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
1f750 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
1f760 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
1f770 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
1f780 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
1f790 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
1f7a0 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
1f7b0 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
1f7c0 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
1f7d0 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
1f7e0 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
1f7f0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
1f800 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
1f810 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65  .  }.  if( nOrde
1f820 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
1f830 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1f840 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
1f850 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67   it is not being
1f860 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70   ignored, set up
1f870 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  .    ** space fo
1f880 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b  r the aSortCost[
1f890 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c  ] array. Each el
1f8a0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f  ement of the aSo
1f8b0 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20  rtCost array.   
1f8c0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65   ** is either ze
1f8d0 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20  ro - meaning it 
1f8e0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1f8f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f   initialized - o
1f900 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  r the.    ** cos
1f910 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
1f920 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74  wEst rows of dat
1f930 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  a where the firs
1f940 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20  t X terms of.   
1f950 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
1f960 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65   clause are alre
1f970 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68  ady in order, wh
1f980 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72  ere X is the arr
1f990 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ay .    ** index
1f9a0 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43  .  */.    aSortC
1f9b0 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  ost = (LogEst*)p
1f9c0 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  X;.    memset(aS
1f9d0 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  ortCost, 0, size
1f9e0 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
1f9f0 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73  derBy);.  }.  as
1fa00 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d  sert( aSortCost=
1fa10 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
1fa20 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61  pace]==(char*)&a
1fa30 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42  SortCost[nOrderB
1fa40 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y] );.  assert( 
1fa50 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20  aSortCost!=0 || 
1fa60 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
1fa70 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20  =(char*)pX );.. 
1fa80 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
1fa90 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
1faa0 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
1fab0 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
1fac0 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
1fad0 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
1fae0 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
1faf0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
1fb00 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74   above 28.  If t
1fb10 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
1fb20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
1fb30 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
1fb40 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
1fb50 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
1fb60 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  8.  ** rows, the
1fb70 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
1fb80 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1fb90 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
1fba0 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
1fbb0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
1fbc0 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d  8);  assert( 48=
1fbd0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
1fbe0 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  8) );.  nFrom = 
1fbf0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72  1;.  assert( aFr
1fc00 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d  om[0].isOrdered=
1fc10 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  =0 );.  if( nOrd
1fc20 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
1fc30 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c  f nLoop is zero,
1fc40 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
1fc50 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e  no FROM terms in
1fc60 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63   the query. Sinc
1fc70 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  e.    ** in this
1fc80 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
1fc90 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78  may return a max
1fca0 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c  imum of one row,
1fcb0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
1fcc0 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
1fcd0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1fce0 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72   order. Set isOr
1fcf0 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42  dered to nOrderB
1fd00 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69  y to.    ** indi
1fd10 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69  cate this. Or, i
1fd20 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74  f nLoop is great
1fd30 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65  er than zero, se
1fd40 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20  t isOrdered to. 
1fd50 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61     ** -1, indica
1fd60 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ting that the re
1fd70 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20  sult set may or 
1fd80 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72  may not be order
1fd90 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65  ed, .    ** depe
1fda0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f  nding on the loo
1fdb0 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ps added to the 
1fdc0 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a  current plan.  *
1fdd0 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  /.    aFrom[0].i
1fde0 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
1fdf0 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72  >0 ? -1 : nOrder
1fe00 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  By;.  }..  /* Co
1fe10 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
1fe20 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
1fe30 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
1fe40 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
1fe50 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
1fe60 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
1fe70 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
1fe80 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
1fe90 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
1fea0 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
1feb0 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
1fec0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
1fed0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
1fee0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
1fef0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
1ff00 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
1ff10 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
1ff20 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1ff30 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
1ff40 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
1ff50 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
1ff60 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
1ff70 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f         LogEst nO
1ff80 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1ff90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
1ffa0 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72   visited by (pFr
1ffb0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
1ffc0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f        LogEst rCo
1ffd0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1ffe0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
1fff0 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70  of path (pFrom+p
20000 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
20010 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74    LogEst rUnsort
20020 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
20030 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
20040 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70  cost of (pFrom+p
20050 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
20060 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
20070 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
20080 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64  d;  /* isOrdered
20090 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f   for (pFrom+pWLo
200a0 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  op) */.        B
200b0 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20  itmask maskNew; 
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20   /* Mask of src 
200e0 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20  visited by (..) 
200f0 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
20100 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20  sk revMask = 0; 
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20120 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65  Mask of rev-orde
20130 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29  r loops for (..)
20140 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28   */..        if(
20150 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
20160 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
20170 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
20180 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
20190 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
201a0 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
201b0 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
201c0 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ue;.        /* A
201d0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57  t this point, pW
201e0 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64  Loop is a candid
201f0 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65  ate to be the ne
20200 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20  xt loop. .      
20210 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73    ** Compute its
20220 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20   cost */.       
20230 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
20240 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57  ite3LogEstAdd(pW
20250 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
20260 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
20270 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
20280 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
20290 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
202a0 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d  Unsorted, pFrom-
202b0 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20  >rUnsorted);.   
202c0 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f       nOut = pFro
202d0 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70  m->nRow + pWLoop
202e0 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ->nOut;.        
202f0 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d  maskNew = pFrom-
20300 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
20310 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
20320 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
20330 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  red<0 ){.       
20340 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77     isOrdered = w
20350 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
20360 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
20370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20380 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
20390 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
203a0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
203b0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
203c0 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f              iLoo
203d0 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d  p, pWLoop, &revM
203e0 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ask);.        }e
203f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
20400 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
20410 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
20420 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
20430 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69  sOrdered>=0 && i
20440 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42  sOrdered<nOrderB
20450 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
20460 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f  f( aSortCost[isO
20470 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20  rdered]==0 ){.  
20480 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
20490 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d  ost[isOrdered] =
204a0 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
204b0 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t(.             
204c0 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45     pWInfo, nRowE
204d0 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73  st, nOrderBy, is
204e0 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
204f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
20500 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f   }.          rCo
20510 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
20520 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
20530 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
20540 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20  ered]);..       
20550 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
20560 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  002,.           
20570 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63     ("---- sort c
20580 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29  ost=%-3d (%d/%d)
20590 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
205a0 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a  %3d to %-3d\n",.
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
205c0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
205d0 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69  ed], (nOrderBy-i
205e0 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65  sOrdered), nOrde
205f0 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
20600 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20       rUnsorted, 
20610 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20  rCost));.       
20620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20630 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72    rCost = rUnsor
20640 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ted;.        }..
20650 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
20660 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f   to see if pWLoo
20670 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65  p should be adde
20680 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a  d to the set of.
20690 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f          ** mxCho
206a0 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ice best-so-far 
206b0 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a  paths..        *
206c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72  *.        ** Fir
206d0 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  st look for an e
206e0 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f  xisting path amo
206f0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
20700 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  aths.        ** 
20710 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20  that covers the 
20720 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
20730 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
20740 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  me isOrdered.   
20750 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20       ** setting 
20760 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  as the current p
20770 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20  ath candidate.. 
20780 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20790 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28    ** The term "(
207a0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
207b0 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
207c0 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65  ==0" is equivale
207d0 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  nt.        ** to
207e0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
207f0 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65  ==(-1))==(isOrde
20800 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20  red==(-1))" for 
20810 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20  the range.      
20820 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61    ** of legal va
20830 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72  lues for isOrder
20840 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20  ed, -1..64..    
20850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
20860 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
20870 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
20880 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
20890 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
208a0 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20  oop==maskNew.   
208b0 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
208c0 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
208d0 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a  dered)&0x80)==0.
208e0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
208f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
20900 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a  e( jj==nTo-1 );.
20910 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
20920 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
20930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20940 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
20950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
20960 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  e of the existin
20970 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
20980 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61  ths match the ca
20990 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20  ndidate. */.    
209a0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
209b0 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
209c0 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43     && (rCost>mxC
209d0 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d  ost || (rCost==m
209e0 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74  xCost && rUnsort
209f0 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29  ed>=mxUnsorted))
20a00 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
20a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20a20 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61   current candida
20a30 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20  te is no better 
20a40 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  than any of the 
20a50 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
20a60 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75       ** paths cu
20a70 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62  rrently in the b
20a80 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65  est-so-far buffe
20a90 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20  r.  So discard. 
20aa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
20ab0 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20  is candidate as 
20ac0 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23  not viable. */.#
20ad0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
20ae0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
20af0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
20b00 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
20b10 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
20b20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20b30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
20b40 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
20b50 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
20b60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20b70 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
20b80 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
20b90 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
20ba0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
20bb0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
20bc0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
20bd0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
20be0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
20bf0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
20c00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
20c20 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
20c30 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
20c40 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
20c50 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
20c60 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
20c70 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
20c80 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
20c90 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
20ca0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
20cb0 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
20cd0 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
20ce0 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
20cf0 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
20d00 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
20d10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
20d20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
20d30 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
20d40 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
20d50 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
20d60 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
20d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20d80 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
20d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20da0 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
20db0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
20dc0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
20dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
20de0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
20df0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
20e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
20e10 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
20e20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
20e30 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
20e60 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
20e70 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
20e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20e90 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
20ea0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
20eb0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
20ec0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20ee0 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
20ef0 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65  aches here if be
20f00 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70  st-so-far path p
20f10 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72  To=aTo[jj] cover
20f20 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
20f30 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  ** same set of l
20f40 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
20f50 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73   sam isOrdered s
20f60 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
20f70 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
20f80 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
20f90 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
20fa0 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
20fb0 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
20fc0 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
20fd0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
20fe0 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20  ould be skipped 
20ff0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
21000 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73   pTo->rCost<rCos
21010 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74  t || (pTo->rCost
21020 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  ==rCost && pTo->
21030 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23  nRow<=nOut) ){.#
21040 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
21050 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
21060 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
21070 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
21080 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
21090 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
210a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
210d0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
210e0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
210f0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21100 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
21110 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
21120 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
21130 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
21140 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
21150 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21170 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21180 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
21190 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c  -3d,%d order=%c\
211a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
211b0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
211c0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
211d0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
211e0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21200 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
21210 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
21220 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
21230 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
21240 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  if.            /
21250 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  * Discard the ca
21260 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72 6f  ndidate path fro
21270 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
21280 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
21290 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
212a0 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
212b0 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
212c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
212d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
212e0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
212f0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
21300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
21310 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
21320 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e 64  here if the cand
21330 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62 65  idate path is be
21340 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  tter than the.  
21350 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70          ** pTo p
21360 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54  ath.  Replace pT
21370 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64 69  o with the candi
21380 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  date. */.#ifdef 
21390 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
213a0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
213b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
213c0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
213d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
213e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
213f0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
21400 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
21410 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
21420 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
21430 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
21440 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
21450 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
21460 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
21470 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
21480 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
21490 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
214a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
214b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
214c0 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33   was %s cost=%-3
214d0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
214e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
214f0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
21500 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
21510 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
21520 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
21530 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
21540 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
21550 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
21560 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
21570 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
21590 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
215a0 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
215b0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
215c0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
215d0 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
215e0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
215f0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
21600 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
21610 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
21620 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
21630 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
21640 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
21650 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
21660 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
21670 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  ed = rUnsorted;.
21680 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
21690 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
216a0 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
216b0 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
216c0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
216d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
216e0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
216f0 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
21700 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
21710 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
21720 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
21730 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
21740 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
21750 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
21760 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
21770 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b  d = aTo[0].nRow;
21780 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
21790 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
217a0 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
217b0 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
217c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
217d0 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a  ->rCost>mxCost .
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
217f0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
21800 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73  ost && pTo->rUns
21810 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64  orted>mxUnsorted
21820 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
21830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21840 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
21850 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
21860 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
21870 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a  pTo->rUnsorted;.
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
21890 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
218a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
218b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
218c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
218d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
218e0 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a  BLED  /* >=2 */.
218f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
21900 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32  hereTrace & 0x02
21910 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21920 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
21930 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
21940 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
21950 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
21960 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
21970 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
21980 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21990 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
219a0 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
219b0 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
219c0 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
219d0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
219e0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
219f0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
21a00 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
21a10 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
21a20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
21a30 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
21a40 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
21a50 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
21a60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21a70 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
21a80 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
21a90 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
21aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ab0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
21ac0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
21ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21ae0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
21af0 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
21b00 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
21b10 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
21b20 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
21b30 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
21b40 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
21b50 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
21b60 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
21b70 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
21b80 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
21b90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21ba0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
21bb0 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
21bc0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21bd0 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
21be0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21bf0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
21c00 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
21c10 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
21c20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
21c30 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
21c40 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
21c50 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
21c60 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
21c70 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
21c80 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
21c90 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
21ca0 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
21cb0 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
21cc0 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
21cd0 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
21ce0 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
21cf0 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
21d00 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
21d10 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
21d20 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
21d30 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
21d40 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
21d50 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
21d60 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
21d70 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
21d80 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
21d90 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
21da0 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
21db0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
21dc0 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
21dd0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
21de0 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
21df0 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
21e00 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
21e10 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
21e20 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
21e30 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
21e40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
21e50 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
21e60 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
21e70 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
21e80 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
21e90 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
21ea0 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
21eb0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
21ec0 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
21ed0 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
21ee0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
21ef0 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
21f00 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
21f10 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
21f20 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
21f30 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
21f40 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
21f50 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
21f60 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
21f70 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
21f80 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
21f90 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
21fa0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
21fb0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
21fc0 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
21fd0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
21fe0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
21ff0 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
22000 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
22010 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
22020 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
22030 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
22040 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
22050 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
22060 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
22070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
22080 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
22090 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
220a0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
220b0 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49  ->nOBSat<0 ) pWI
220c0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
220d0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
220e0 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
220f0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
22100 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
22110 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22120 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
22130 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
22140 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
22150 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
22160 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
22170 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
22180 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
22190 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
221a0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
221b0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
221c0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
221d0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
221e0 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
221f0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
22200 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
22210 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
22220 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
22230 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
22240 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
22250 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
22260 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
22270 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
22280 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
22290 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
222a0 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
222b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
222c0 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
222d0 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
222e0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
222f0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
22300 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
22310 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22320 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
22330 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22340 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
22350 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
22360 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
22370 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
22380 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
22390 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
223a0 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
223b0 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
223c0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
223d0 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
223e0 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
223f0 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
22400 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
22410 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
22420 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
22430 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
22440 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
22450 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
22460 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
22470 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
22480 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
22490 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
224a0 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
224b0 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
224c0 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
224d0 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
224e0 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
224f0 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
22500 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
22510 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
22520 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
22530 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
22540 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
22550 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
22560 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
22570 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
22580 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22590 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
225a0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
225b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
225c0 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
225d0 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
225e0 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
225f0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
22600 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70  ex *pIdx;.  .  p
22610 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
22620 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
22630 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22640 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
22650 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20  _TABLE ) return 
22660 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
22670 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
22680 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
22690 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
226a0 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
226b0 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
226c0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
226d0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
226e0 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67  .  if( pItem->fg
226f0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72  .isIndexedBy ) r
22700 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
22710 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
22720 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
22730 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
22740 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
22750 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
22760 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d  gs = 0;.  pLoop-
22770 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54  >nSkip = 0;.  pT
22780 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
22790 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
227a0 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
227b0 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  EQ|WO_IS, 0);.  
227c0 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
227d0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
227e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
227f0 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  _IS );.    pLoop
22800 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
22810 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
22820 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
22830 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
22840 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
22850 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
22860 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
22870 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
22880 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
22890 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
228a0 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
228b0 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
228c0 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
228d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
228e0 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  10) */.  }else{.
228f0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
22900 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
22910 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
22920 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  t){.      int op
22930 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  Mask;.      asse
22940 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rt( pLoop->aLTer
22950 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61  mSpace==pLoop->a
22960 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69  LTerm );.      i
22970 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  f( !IsUniqueInde
22980 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c  x(pIdx).       |
22990 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
229a0 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
229b0 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   || pIdx->nKeyCo
229c0 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  l>ArraySize(pLoo
229d0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
229e0 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
229f0 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  e;.      opMask 
22a00 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  = pIdx->uniqNotN
22a10 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f  ull ? (WO_EQ|WO_
22a20 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20  IS) : WO_EQ;.   
22a30 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
22a40 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
22a50 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
22a60 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
22a70 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
22a80 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c  r, j, 0, opMask,
22a90 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
22aa0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
22ab0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65  reak;.        te
22ac0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
22ad0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
22ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   );.        pLoo
22af0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
22b00 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
22b10 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
22b20 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
22b30 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
22b40 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
22b50 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
22b60 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
22b70 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
22b80 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69  ( pIdx->isCoveri
22b90 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f  ng || (pItem->co
22ba0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
22bb0 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
22bc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
22bd0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
22be0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
22bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
22c00 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
22c10 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
22c20 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
22c30 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
22c40 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
22c50 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
22c60 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
22c70 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
22c80 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
22c90 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
22ca0 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
22cb0 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
22cc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22cd0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
22ce0 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
22cf0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
22d00 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
22d10 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
22d20 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
22d30 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  pLoop->maskSelf 
22d40 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
22d50 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
22d60 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
22d70 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
22d80 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
22d90 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
22da0 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
22db0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
22dc0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
22dd0 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70  Sat =  pWInfo->p
22de0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
22df0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
22e00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22e10 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
22e20 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
22e30 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
22e40 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
22e50 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
22e60 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
22e70 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
22e80 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
22e90 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
22ea0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
22eb0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
22ec0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
22ed0 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
22ee0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
22ef0 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
22f00 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
22f10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
22f20 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
22f30 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
22f40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
22f50 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
22f60 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
22f70 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
22f80 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
22f90 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
22fa0 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
22fb0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
22fc0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
22fd0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
22fe0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
22ff0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23000 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
23010 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
23020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
23030 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
23040 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
23050 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
23060 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
23070 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
23080 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
23090 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
230a0 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
230b0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
230c0 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
230d0 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
230e0 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
230f0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
23100 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
23110 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
23120 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
23130 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
23140 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
23150 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
23160 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
23170 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
23180 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
23190 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
231a0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
231b0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
231c0 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
231d0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
231e0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
231f0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
23200 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
23210 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
23220 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
23230 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
23240 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
23250 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
23260 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
23270 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
23280 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
23290 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
232c0 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
232d0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232f0 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
23300 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
23310 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
23320 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
23330 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
23340 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
23350 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
23360 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
23370 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
23380 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
23390 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
233a0 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
233b0 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
233c0 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
233d0 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
233e0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
233f0 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
23400 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
23410 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
23420 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
23430 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
23440 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
23450 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
23460 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
23470 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
23480 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
23490 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
234a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
234b0 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
234c0 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
234d0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
234e0 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
234f0 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
23500 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
23510 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
23520 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
23530 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
23540 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
23550 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
23560 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
23570 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
23580 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
23590 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
235a0 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
235b0 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
235c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
235d0 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
235e0 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
235f0 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
23600 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
23610 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
23620 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
23630 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
23640 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
23650 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
23660 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
23670 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
23680 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
23690 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
236a0 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
236b0 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
236c0 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
236d0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
236e0 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
236f0 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
23700 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
23710 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
23720 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
23730 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
23740 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
23750 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
23760 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
23770 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
23780 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
23790 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
237a0 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
237b0 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
237c0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
237d0 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
237e0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
237f0 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
23800 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
23810 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
23820 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
23830 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23840 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
23850 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
23860 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
23870 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
23880 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
23890 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
238a0 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
238b0 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
238c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
238d0 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
238e0 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
238f0 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
23900 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
23910 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
23920 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
23930 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
23940 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
23950 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
23960 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
23970 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
23980 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
23990 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
239a0 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
239b0 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
239c0 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
239d0 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
239e0 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
239f0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
23a00 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
23a10 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
23a20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
23a30 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
23a40 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
23a50 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
23a60 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
23a70 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
23a80 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
23a90 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
23aa0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
23ab0 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
23ac0 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
23ad0 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
23ae0 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
23af0 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
23b00 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
23b10 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
23b20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
23b30 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
23b40 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
23b50 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
23b60 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
23b70 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
23b80 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
23b90 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
23ba0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
23bb0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
23bc0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
23bd0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
23be0 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
23bf0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
23c00 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
23c10 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
23c20 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
23c30 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
23c40 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70  ** The iIdxCur p
23c50 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
23c60 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
23c70 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a   an index.  If .
23c80 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
23c90 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
23ca0 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75  IdxCur is the cu
23cb0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
23cc0 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73  n index.** to us
23cd0 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  e for OR clause 
23ce0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
23cf0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68   WHERE clause sh
23d00 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a  ould use this.**
23d10 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72   specific cursor
23d20 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50  .  If WHERE_ONEP
23d30 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73  ASS_DESIRED is s
23d40 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72  et, then iIdxCur
23d50 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
23d60 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72   cursor in an ar
23d70 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66  ray of cursors f
23d80 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20  or all indices. 
23d90 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a   iIdxCur should.
23da0 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f  ** be used to co
23db0 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70  mpute the approp
23dc0 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70  riate cursor dep
23dd0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
23de0 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64  index is.** used
23df0 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
23e00 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23e10 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
23e20 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  se,        /* Th
23e30 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
23e40 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
23e50 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46  TabList,    /* F
23e60 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69  ROM clause: A li
23e70 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
23e80 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
23e90 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
23ea0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
23eb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
23ec0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
23ed0 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
23ee0 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
23ef0 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72  P BY) clause, or
23f00 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
23f10 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
23f20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f   /* Result set o
23f30 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
23f40 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
23f50 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
23f60 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
23f70 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
23f80 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
23f90 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20  nt iIdxCur      
23fa0 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
23fb0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
23fc0 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
23fd0 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  sor number */.){
23fe0 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
23ff0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
24000 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
24010 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
24020 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
24030 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
24040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24050 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
24060 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
24070 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
24080 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
24090 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
240a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
240b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
240c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
240d0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
240e0 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
240f0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
24100 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
24110 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
24120 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
24130 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
24140 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
24150 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
24160 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
24170 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
24180 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
24190 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
241a0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
241b0 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
241c0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
241d0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
241e0 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
241f0 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68  nfo->a[] */.  Wh
24200 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
24210 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
24220 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
24230 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24240 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24260 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
24270 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24280 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
24290 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
242a0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
242b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
242c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
242d0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
242e0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
242f0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
24300 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c  _MULTIROW)==0 ||
24310 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72   (.        (wctr
24320 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
24330 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
24340 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74  =0 .     && (wct
24350 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
24360 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
24370 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  ==0 .  ));..  /*
24380 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
24390 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62  lization */.  db
243a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
243b0 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30   memset(&sWLB, 0
243c0 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b  , sizeof(sWLB));
243d0 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f  ..  /* An ORDER/
243e0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
243f0 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20  of more than 63 
24400 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20  terms cannot be 
24410 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74  optimized */.  t
24420 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72 42  estcase( pOrderB
24430 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e  y && pOrderBy->n
24440 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  Expr==BMS-1 );. 
24450 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
24460 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
24470 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79  >=BMS ) pOrderBy
24480 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72   = 0;.  sWLB.pOr
24490 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
244a0 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  ;..  /* Disable 
244b0 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74  the DISTINCT opt
244c0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c  imization if SQL
244d0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
244e0 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20  is set via.  ** 
244f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72  sqlite3_test_ctr
24500 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
24510 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
24520 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ...) */.  if( Op
24530 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
24540 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69  ed(db, SQLITE_Di
24550 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20  stinctOpt) ){.  
24560 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20    wctrlFlags &= 
24570 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54  ~WHERE_WANT_DIST
24580 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  INCT;.  }..  /* 
24590 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
245a0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
245b0 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
245c0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
245d0 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
245e0 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
245f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
24600 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
24610 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
24620 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
24630 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24640 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
24650 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
24660 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
24670 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
24680 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
24690 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
246a0 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
246b0 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
246c0 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
246d0 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
246e0 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54  f the WHERE_ONET
246f0 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
24700 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
24710 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
24720 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
24730 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
24740 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
24750 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
24760 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
24770 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
24780 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
24790 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
247a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
247b0 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
247c0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
247d0 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70  LE_ONLY) ? 1 : p
247e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
247f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
24800 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
24810 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
24820 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
24830 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
24840 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
24850 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
24860 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
24870 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
24880 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
24890 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
248a0 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
248b0 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
248c0 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
248d0 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
248e0 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
248f0 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
24900 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
24910 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
24920 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
24930 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
24940 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
24950 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
24960 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
24970 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
24980 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
24990 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
249a0 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
249b0 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d  Info)+(nTabList-
249c0 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  1)*sizeof(WhereL
249d0 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f  evel));.  pWInfo
249e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
249f0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
24a00 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57  WInfo + sizeof(W
24a10 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66  hereLoop));.  if
24a20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24a30 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
24a40 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
24a50 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
24a60 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
24a70 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
24a80 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43   }.  pWInfo->aiC
24a90 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
24aa0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
24ab0 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  ass[1] = -1;.  p
24ac0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
24ad0 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
24ae0 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
24af0 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
24b00 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
24b10 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
24b20 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
24b30 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65  y;.  pWInfo->pRe
24b40 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c  sultSet = pResul
24b50 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
24b60 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d  iBreak = pWInfo-
24b70 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  >iContinue = sql
24b80 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
24b90 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
24ba0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
24bb0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
24bc0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
24bd0 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
24be0 65 72 79 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72  eryLoop;.  asser
24bf0 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  t( pWInfo->eOneP
24c00 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
24c10 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20   );  /* ONEPASS 
24c20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20  defaults to OFF 
24c30 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  */.  pMaskSet = 
24c40 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
24c50 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
24c60 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
24c70 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
24c80 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
24c90 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
24ca0 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
24cb0 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
24cc0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
24cd0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
24ce0 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
24cf0 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
24d00 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
24d10 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
24d20 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
24d30 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
24d40 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
24d50 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
24d60 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
24d70 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
24d80 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
24d90 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
24da0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
24db0 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
24dc0 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
24dd0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  .  sqlite3WhereC
24de0 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66  lauseInit(&pWInf
24df0 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b  o->sWC, pWInfo);
24e00 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53  .  sqlite3WhereS
24e10 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  plit(&pWInfo->sW
24e20 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
24e30 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70  D);.    .  /* Sp
24e40 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
24e50 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
24e60 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
24e70 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
24e80 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
24e90 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
24ea0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
24eb0 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
24ec0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
24ed0 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
24ee0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
24ef0 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c  ( nTabList==0 ||
24f00 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
24f10 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57  nstantNotJoin(sW
24f20 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
24f30 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
24f40 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24f50 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57  (pParse, sWLB.pW
24f60 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  C->a[ii].pExpr, 
24f70 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a  pWInfo->iBreak,.
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
24fa0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
24fb0 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69     sWLB.pWC->a[i
24fc0 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  i].wtFlags |= TE
24fd0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
24fe0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
24ff0 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
25000 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
25010 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
25020 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
25030 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
25040 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
25050 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
25060 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
25070 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
25080 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
25090 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
250a0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
250b0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
250c0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
250d0 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
250e0 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
250f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
25100 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
25110 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68   N-th term of th
25120 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
25130 20 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d   assigned a bitm
25140 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a  ask of 1<<N..  *
25150 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20  *.  ** The rule 
25160 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
25170 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73  sentence ensures
25180 20 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68   thta if X is th
25190 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20  e bitmask for.  
251a0 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68  ** a table T, th
251b0 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62 69  en X-1 is the bi
251c0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74  tmask for all ot
251d0 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68  her tables to th
251e0 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a  e left of T..  *
251f0 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69  * Knowing the bi
25200 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
25210 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
25220 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
25230 69 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e  is.  ** importan
25240 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
25250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
25260 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
25270 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
25280 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
25290 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
252a0 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
252b0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
252c0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
252d0 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
252e0 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
252f0 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
25300 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
25310 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
25320 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
25330 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
25340 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
25350 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25360 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
25370 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
25380 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25390 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
253a0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
253b0 69 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63  ite3WhereTabFunc
253c0 41 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54  Args(pParse, &pT
253d0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26  abList->a[ii], &
253e0 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
253f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
25400 44 45 42 55 47 0a 20 20 66 6f 72 28 69 69 3d 30  DEBUG.  for(ii=0
25410 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
25420 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
25430 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69  Bitmask m = sqli
25440 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
25450 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
25460 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
25470 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
25480 6d 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29 20 29  m==MASKBIT(ii) )
25490 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
254a0 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
254b0 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
254c0 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ions. */.  sqlit
254d0 65 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79  e3WhereExprAnaly
254e0 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57  ze(pTabList, &pW
254f0 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66  Info->sWC);.  if
25500 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25510 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
25520 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66  eginError;..  if
25530 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
25540 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
25550 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  CT ){.    if( is
25560 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
25570 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
25580 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
25590 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b  , pResultSet) ){
255a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49  .      /* The DI
255b0 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69  STINCT marking i
255c0 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67  s pointless.  Ig
255d0 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  nore it. */.    
255e0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
255f0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
25600 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
25610 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65   }else if( pOrde
25620 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
25630 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20  /* Try to ORDER 
25640 42 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  BY the result se
25650 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e  t to make distin
25660 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61  ct processing ea
25670 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57  sier */.      pW
25680 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
25690 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e   |= WHERE_DISTIN
256a0 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e  CTBY;.      pWIn
256b0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
256c0 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d  ResultSet;.    }
256d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
256e0 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f  ruct the WhereLo
256f0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
25700 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
25710 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
25720 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
25730 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
25740 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25750 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  ).  if( sqlite3W
25760 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
25770 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20  0 ){ /* Display 
25780 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
25790 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
257a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
257b0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e  for(i=0; i<sWLB.
257c0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
257d0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72  {.      whereTer
257e0 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e 70 57 43  mPrint(&sWLB.pWC
257f0 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  ->a[i], i);.    
25800 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
25810 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
25820 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
25830 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
25840 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
25850 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
25860 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
25870 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
25880 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52  ;.  .#ifdef WHER
25890 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
258a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
258b0 65 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f  ereTrace ){    /
258c0 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
258d0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
258e0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  bjects */.      
258f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
25900 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
25910 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
25920 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30  ar zLabel[] = "0
25930 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67  123456789abcdefg
25940 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
25950 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20  yxz".           
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
25990 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a  NOPQRSTUVWYXZ";.
259a0 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e        for(p=pWIn
259b0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b  fo->pLoops, i=0;
259c0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
259d0 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  op, i++){.      
259e0 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65    p->cId = zLabe
259f0 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65  l[i%sizeof(zLabe
25a00 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65  l)];.        whe
25a10 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73  reLoopPrint(p, s
25a20 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  WLB.pWC);.      
25a30 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
25a40 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53   .    wherePathS
25a50 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29  olver(pWInfo, 0)
25a60 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
25a70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
25a80 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
25a90 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
25aa0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
25ab0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53        wherePathS
25ac0 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57  olver(pWInfo, pW
25ad0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29  Info->nRowOut+1)
25ae0 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  ;.       if( db-
25af0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
25b00 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
25b10 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
25b20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
25b30 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62  rderBy==0 && (db
25b40 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
25b50 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d  _ReverseOrder)!=
25b60 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f  0 ){.     pWInfo
25b70 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74  ->revMask = (Bit
25b80 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20  mask)(-1);.  }. 
25b90 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
25ba0 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d  r || NEVER(db->m
25bb0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
25bc0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
25bd0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69  ginError;.  }.#i
25be0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
25bf0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
25c00 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
25c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
25c20 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
25c30 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
25c40 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
25c50 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
25c60 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b  nfo->nOBSat>0 ){
25c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25c80 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
25c90 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20  RBY=%d,0x%llx", 
25ca0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
25cb0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
25cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
25cd0 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
25ce0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
25cf0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
25d00 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
25d10 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25d20 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
25d30 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
25d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25d50 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
25d60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
25d70 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
25d80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25d90 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
25da0 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
25db0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25dc0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
25dd0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
25de0 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
25df0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25e00 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
25e10 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
25e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25e30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
25e40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25e50 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
25e60 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
25e70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
25e80 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
25e90 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
25ea0 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
25eb0 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
25ec0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74  .#endif.  /* Att
25ed0 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
25ee0 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
25ef0 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66  n that do not ef
25f00 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20  fect the result 
25f10 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
25f20 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26  >nLevel>=2.   &&
25f30 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20   pResultSet!=0. 
25f40 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
25f50 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
25f60 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
25f70 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  ).  ){.    Bitma
25f80 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c  sk tabUsed = sql
25f90 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
25fa0 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
25fb0 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20   pResultSet);.  
25fc0 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65    if( sWLB.pOrde
25fd0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62  rBy ){.      tab
25fe0 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57  Used |= sqlite3W
25ff0 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
26000 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
26010 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
26020 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  }.    while( pWI
26030 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29  nfo->nLevel>=2 )
26040 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
26050 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b  m *pTerm, *pEnd;
26060 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
26070 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d  WInfo->a[pWInfo-
26080 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f  >nLevel-1].pWLoo
26090 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57  p;.      if( (pW
260a0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
260b0 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66  a[pLoop->iTab].f
260c0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
260d0 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b  LEFT)==0 ) break
260e0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74  ;.      if( (wct
260f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26100 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d  WANT_DISTINCT)==
26110 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f  0.       && (pLo
26120 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
26130 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20  ERE_ONEROW)==0. 
26140 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26150 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26160 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73 65       if( (tabUse
26170 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  d & pLoop->maskS
26180 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  elf)!=0 ) break;
26190 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57  .      pEnd = sW
261a0 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42  LB.pWC->a + sWLB
261b0 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  .pWC->nTerm;.   
261c0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c     for(pTerm=sWL
261d0 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  B.pWC->a; pTerm<
261e0 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  pEnd; pTerm++){.
261f0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
26200 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
26210 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
26220 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
26230 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26240 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
26250 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
26260 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26270 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26280 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
26290 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29  if( pTerm<pEnd )
262a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48   break;.      WH
262b0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
262c0 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20   ("-> drop loop 
262d0 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20  %c not used\n", 
262e0 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20  pLoop->cId));.  
262f0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76      pWInfo->nLev
26300 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62  el--;.      nTab
26310 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  List--;.    }.  
26320 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
26330 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
26340 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
26350 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
26360 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
26370 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
26380 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
26390 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
263a0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
263b0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
263c0 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
263d0 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
263e0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
263f0 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
26400 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
26410 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
26420 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
26430 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
26440 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
26450 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a   constrains.  **
26460 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
26470 6f 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  o update or dele
26480 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
26490 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
264a0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
264b0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
264c0 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
264d0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
264e0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
264f0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26500 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b  S_DESIRED)!=0 ){
26510 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
26520 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e   = pWInfo->a[0].
26530 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
26540 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77  .    int bOnerow
26550 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48   = (wsFlags & WH
26560 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a  ERE_ONEROW)!=0;.
26570 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20      if( bOnerow 
26580 7c 7c 20 28 20 28 77 63 74 72 6c 46 6c 61 67 73  || ( (wctrlFlags
26590 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
265a0 5f 4d 55 4c 54 49 52 4f 57 29 0a 20 20 20 20 20  _MULTIROW).     
265b0 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61 67 73    && 0==(wsFlags
265c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
265d0 54 41 42 4c 45 29 0a 20 20 20 20 29 29 7b 0a 20  TABLE).    )){. 
265e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e       pWInfo->eOn
265f0 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20  ePass = bOnerow 
26600 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45  ? ONEPASS_SINGLE
26610 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49   : ONEPASS_MULTI
26620 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  ;.      if( HasR
26630 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61  owid(pTabList->a
26640 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
26650 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
26660 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
26670 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
26680 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
26690 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70    }.  }..  /* Op
266a0 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
266b0 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
266c0 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
266d0 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
266e0 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
266f0 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
26700 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
26710 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
26720 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
26730 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
26740 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
26750 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
26760 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
26770 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26780 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
26790 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
267a0 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
267b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
267c0 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
267d0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
267e0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
267f0 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
26800 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
26810 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
26820 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
26830 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
26840 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  a);.    pLoop = 
26850 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
26860 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
26870 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
26880 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
26890 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
268a0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
268b0 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  ng */.    }else.
268c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
268d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
268e0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
268f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26900 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
26910 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
26920 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
26930 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
26940 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
26950 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
26960 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
26970 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
26980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26990 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
269a0 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56  , iCur, 0, 0, pV
269b0 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
269c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
269d0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
269e0 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f        /* noop */
269f0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
26a00 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  f.    if( (pLoop
26a10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26a20 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
26a30 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
26a40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26a50 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
26a60 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
26a70 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
26a80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
26a90 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
26aa0 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
26ab0 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
26ac0 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
26ad0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
26ae0 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
26af0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
26b00 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
26b10 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
26b20 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
26b30 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
26b40 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
26b50 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
26b60 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
26b70 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
26b80 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
26b90 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
26ba0 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
26bb0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
26bc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26bd0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
26be0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
26bf0 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
26c00 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
26c10 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
26c20 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
26c30 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
26c40 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
26c50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ) ){.        Bit
26c60 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
26c70 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
26c80 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
26c90 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
26ca0 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
26cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26cc0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71  beChangeP4(v, sq
26cd0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
26ce0 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20  Addr(v)-1, .    
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
26d10 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34  NT_TO_PTR(n), P4
26d20 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20  _INT32);.       
26d30 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62   assert( n<=pTab
26d40 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
26d50 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
26d60 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
26d70 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c  NTS.      if( pL
26d80 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
26d90 64 65 78 21 3d 30 20 29 20 73 71 6c 69 74 65 33  dex!=0 ) sqlite3
26da0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
26db0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 0a  OPFLAG_SEEKEQ);.
26dc0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
26dd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
26de0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
26df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26e00 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
26e10 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62  olumnsUsed, pTab
26e20 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
26e30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61   (const u8*)&pTa
26e60 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20  bItem->colUsed, 
26e70 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
26e80 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
26e90 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
26ea0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
26eb0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
26ec0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
26ed0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
26ee0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
26ef0 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
26f00 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
26f10 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
26f20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
26f30 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  t iIndexCur;.   
26f40 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
26f50 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f  penRead;.      /
26f60 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77  * iIdxCur is alw
26f70 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20  ays set if to a 
26f80 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
26f90 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73  f ONEPASS is pos
26fa0 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  sible */.      a
26fb0 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d  ssert( iIdxCur!=
26fc0 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63  0 || (pWInfo->wc
26fd0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26fe0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
26ff0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
27000 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
27010 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65  ) && IsPrimaryKe
27020 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20  yIndex(pIx).    
27030 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
27040 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
27050 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20  LE_ONLY)!=0.    
27060 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
27070 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d  This is one term
27080 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69   of an OR-optimi
27090 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  zation using the
270a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
270b0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54  a.        ** WIT
270c0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
270d0 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61  .  No need for a
270e0 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20   separate index 
270f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  */.        iInde
27100 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
27110 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20  TabCur;.        
27120 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  op = 0;.      }e
27130 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  lse if( pWInfo->
27140 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
27150 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
27160 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61   Index *pJ = pTa
27170 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e  bItem->pTab->pIn
27180 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e  dex;.        iIn
27190 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  dexCur = iIdxCur
271a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
271b0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
271c0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
271d0 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  IRED );.        
271e0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a  while( ALWAYS(pJ
271f0 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a  ) && pJ!=pIx ){.
27200 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78            iIndex
27210 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Cur++;.         
27220 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b   pJ = pJ->pNext;
27230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27240 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
27250 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
27260 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
27270 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75  ss[1] = iIndexCu
27280 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
27290 66 28 20 69 49 64 78 43 75 72 20 26 26 20 28 77  f( iIdxCur && (w
272a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
272b0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
272c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
272d0 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43  IndexCur = iIdxC
272e0 75 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ur;.        if( 
272f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27300 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29 20  RE_REOPEN_IDX ) 
27310 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64  op = OP_ReopenId
27320 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
27330 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
27340 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
27350 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
27360 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
27370 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  r = iIndexCur;. 
27380 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
27390 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
273a0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
273b0 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
273c0 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
273d0 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20  if( op ){.      
273e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
273f0 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65  Op3(v, op, iInde
27400 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
27410 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
27420 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
27430 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
27440 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ix);.        if(
27450 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
27460 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
27470 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20  INT)!=0.        
27480 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
27490 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
274a0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
274b0 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20  SKIPSCAN))==0.  
274c0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
274d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
274e0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
274f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
27500 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27510 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27520 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20  OPFLAG_SEEKEQ); 
27530 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42  /* Hint to COMDB
27540 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  2 */.        }. 
27550 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
27560 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
27570 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65  ->zName));.#ifde
27580 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27590 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
275a0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
275b0 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64       u64 colUsed
275c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
275d0 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20  int ii, jj;.    
275e0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
275f0 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ii<pIx->nColumn;
27600 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
27610 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69      jj = pIx->ai
27620 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20  Column[ii];.    
27630 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30          if( jj<0
27640 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27650 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e           if( jj>
27660 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20  63 ) jj = 63;.  
27670 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27680 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
27690 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d   & MASKBIT(jj))=
276a0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
276b0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
276c0 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c  ed |= ((u64)1)<<
276d0 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33  (ii<63 ? ii : 63
276e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
276f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27700 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
27710 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
27720 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20  , iIndexCur, 0, 
27730 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64     (u8*)&colUsed
27760 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
27770 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
27780 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
27790 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20  OLUMN_USED_MASK 
277a0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
277b0 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20  .    if( iDb>=0 
277c0 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
277d0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
277e0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
277f0 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
27800 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
27810 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
27820 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
27830 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
27840 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
27850 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
27860 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
27870 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
27880 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
27890 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
278a0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
278b0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
278c0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
278d0 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
278e0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
278f0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
27900 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
27910 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  st; ii++){.    i
27920 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a  nt addrExplain;.
27930 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
27940 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
27950 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
27960 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76    wsFlags = pLev
27970 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
27980 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ags;.#ifndef SQL
27990 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
279a0 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
279b0 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
279c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
279d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
279e0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
279f0 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
27a00 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
27a10 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
27a20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
27a30 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
27a40 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
27a50 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
27a60 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27a70 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
27a80 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
27a90 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
27aa0 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
27ab0 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
27ac0 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50  Scan(.        pP
27ad0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
27ae0 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
27af0 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
27b00 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20  Flags.    );.   
27b10 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
27b20 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  y = sqlite3VdbeC
27b30 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
27b40 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71     notReady = sq
27b50 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e  lite3WhereCodeOn
27b60 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
27b70 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
27b80 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
27b90 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
27ba0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20  ->addrCont;.    
27bb0 69 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45  if( (wsFlags&WHE
27bc0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
27bd0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  && (wctrlFlags&W
27be0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
27bf0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
27c00 73 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53  sqlite3WhereAddS
27c10 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61  canStatus(v, pTa
27c20 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61  bList, pLevel, a
27c30 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  ddrExplain);.   
27c40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e   }.  }..  /* Don
27c50 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  e. */.  VdbeModu
27c60 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  leComment((v, "B
27c70 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22  egin WHERE-core"
27c80 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  ));.  return pWI
27c90 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
27ca0 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
27cb0 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
27cc0 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  inError:.  if( p
27cd0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61  WInfo ){.    pPa
27ce0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
27cf0 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
27d00 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77  QueryLoop;.    w
27d10 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
27d20 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pWInfo);.  }.  
27d30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
27d40 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
27d50 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
27d60 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
27d70 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
27d80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
27d90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
27da0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
27db0 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
27dc0 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
27dd0 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
27de0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
27df0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
27e00 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
27e10 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
27e20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
27e30 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
27e40 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
27e50 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
27e60 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
27e70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
27e80 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
27e90 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
27ea0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
27eb0 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ..  */.  VdbeMod
27ec0 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
27ed0 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29  End WHERE-core")
27ee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
27ef0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
27f00 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e  e);.  for(i=pWIn
27f10 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
27f20 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; i--){.    in
27f30 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76  t addr;.    pLev
27f40 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
27f50 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  i];.    pLoop = 
27f60 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
27f70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
27f80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
27f90 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
27fa0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
27fb0 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
27fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27fd0 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76  beAddOp3(v, pLev
27fe0 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
27ff0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20  p1, pLevel->p2, 
28000 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20  pLevel->p3);.   
28010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28020 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
28030 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62  ->p5);.      Vdb
28040 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28050 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28060 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
28070 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20  ==OP_Next);.    
28080 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28090 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
280a0 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20  OP_Prev);.      
280b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
280c0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  , pLevel->op==OP
280d0 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  _VNext);.    }. 
280e0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
280f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
28100 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
28110 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
28120 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
28130 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
28140 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
28150 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
28160 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
28170 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
28180 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
28190 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
281a0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
281b0 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
281c0 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
281d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
281e0 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
281f0 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
28200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28210 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  dOp2(v, pIn->eEn
28220 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43  dLoopOp, pIn->iC
28230 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
28240 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
28250 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28260 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28270 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
28280 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76  dLoopOp==OP_Prev
28290 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
282a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
282b0 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
282c0 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65  Op==OP_NextIfOpe
282d0 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
282e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
282f0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
28300 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p-1);.      }.  
28310 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28320 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28330 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
28340 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
28350 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b  vel->addrSkip ){
28360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28370 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c  beGoto(v, pLevel
28380 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
28390 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
283a0 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63  v, "next skip-sc
283b0 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70  an on %s", pLoop
283c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
283d0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
283e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
283f0 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
28400 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
28410 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28420 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
28430 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20  addrSkip-2);.   
28440 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
28450 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29  l->addrLikeRep )
28460 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a  {.      int op;.
28470 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28480 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 4c  3VdbeGetOp(v, pL
28490 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
284a0 70 2d 31 29 2d 3e 70 31 20 29 7b 0a 20 20 20 20  p-1)->p1 ){.    
284b0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 65 63 72      op = OP_Decr
284c0 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20 20 20 20 20  JumpZero;.      
284d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f  }else{.        o
284e0 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65 72 6f 49  p = OP_JumpZeroI
284f0 6e 63 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ncr;.      }.   
28500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28510 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4c 65 76  dOp2(v, op, pLev
28520 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
28530 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69  , pLevel->addrLi
28540 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64  keRep);.      Vd
28550 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
28560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
28570 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
28580 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  {.      addr = s
28590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
285a0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
285b0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
285c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
285d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
285e0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
285f0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
28600 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
28610 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   || (pLoop->wsFl
28620 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
28630 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
28640 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
28650 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
28660 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
28670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28680 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
28690 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e  lRow, pTabList->
286a0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
286b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
286c0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
286d0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
286e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
286f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
28700 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
28710 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
28720 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28730 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
28740 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
28750 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28760 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
28770 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
28780 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
28790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
287a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
287b0 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
287c0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
287d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
287e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
287f0 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
28800 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
28810 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
28820 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
28830 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
28840 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
28850 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
28860 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
28870 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
28880 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
28890 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
288a0 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
288b0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
288c0 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
288d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
288e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
288f0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
28900 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
28910 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
28920 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
28930 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
28940 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
28950 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
28960 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
28970 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b      int k, last;
28980 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
28990 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
289a0 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
289b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
289c0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
289d0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
289e0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
289f0 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
28a00 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
28a10 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
28a20 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
28a30 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
28a40 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f    /* For a co-ro
28a50 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c  utine, change al
28a60 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65  l OP_Column refe
28a70 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61  rences to the ta
28a80 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
28a90 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74  e co-routine int
28aa0 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73  o OP_Copy of res
28ab0 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
28ac0 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
28ad0 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
28ae0 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
28af0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
28b00 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
28b10 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d  outine && !db->m
28b20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
28b30 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f       translateCo
28b40 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c  lumnToCopy(v, pL
28b50 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  evel->addrBody, 
28b60 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
28b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
28b90 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
28ba0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
28bb0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
28bc0 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
28bd0 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
28be0 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
28bf0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
28c00 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
28c10 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72  do not close cur
28c20 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62  sors that will b
28c30 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20  e reused by the 
28c40 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  OR optimization.
28c50 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d      ** (WHERE_OM
28c60 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20  IT_OPEN_CLOSE). 
28c70 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73   And do not clos
28c80 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69  e the OP_OpenWri
28c90 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a  te cursors.    *
28ca0 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  * created for th
28cb0 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69  e ONEPASS optimi
28cc0 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  zation..    */. 
28cd0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
28ce0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
28cf0 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26  meral)==0.     &
28d00 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
28d10 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  =0.     && (pWIn
28d20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
28d30 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
28d40 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29  _CLOSE)==0.    )
28d50 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d  {.      int ws =
28d60 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
28d70 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
28d80 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
28d90 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77 73 20  PASS_OFF && (ws 
28da0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
28db0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
28dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28dd0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
28de0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
28df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28e00 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
28e10 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
28e20 20 20 20 20 26 26 20 28 77 73 20 26 20 28 57 48      && (ws & (WH
28e30 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55  ERE_IPK|WHERE_AU
28e40 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20  TO_INDEX))==0 . 
28e50 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d        && pLevel-
28e60 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f  >iIdxCur!=pWInfo
28e70 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
28e80 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ].      ){.     
28e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28ea0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
28eb0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
28ec0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28ed0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
28ee0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
28ef0 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
28f00 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
28f10 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
28f20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
28f30 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
28f40 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
28f50 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
28f60 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
28f70 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
28f80 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
28f90 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
28fa0 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
28fb0 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
28fc0 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
28fd0 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
28fe0 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
28ff0 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
29000 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
29010 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
29020 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29030 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
29040 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
29050 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
29060 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
29070 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
29080 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
29090 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
290a0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
290b0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
290c0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
290d0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
290e0 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
290f0 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
29100 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
29110 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
29120 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29130 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
29140 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
29150 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
29160 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
29170 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
29180 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
29190 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
291a0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
291b0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
291c0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
291d0 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
291e0 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64    if( pIdx && !d
291f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29200 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  ){.      last = 
29210 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
29220 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
29230 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64   k = pLevel->add
29240 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70  rBody;.      pOp
29250 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
29260 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20  tOp(v, k);.     
29270 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b   for(; k<last; k
29280 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
29290 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
292a0 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
292b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
292c0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
292d0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
292e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
292f0 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20   x = pOp->p2;.  
29300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29310 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54  pIdx->pTable==pT
29320 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab );.          
29330 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
29340 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
29350 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
29360 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
29370 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
29380 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50            x = pP
29390 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a  k->aiColumn[x];.
293a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
293b0 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
293c0 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
293d0 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  Idx, x);.       
293e0 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
293f0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
29400 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  p2 = x;.        
29410 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
29420 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
29430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29440 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
29450 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
29460 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
29470 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20  0 || x>=0 );.   
29480 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
29490 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
294a0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
294b0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
294c0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
294d0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
294e0 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
294f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29500 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
29510 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
29520 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
29530 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
29540 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
29550 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
29560 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
29570 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.